Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   problemas con FileCreate o CreateFile (https://www.clubdelphi.com/foros/showthread.php?t=35125)

beatriz g 01-09-2006 09:17:47

problemas con FileCreate o CreateFile
 
Hola, hola, tengo un problema al crear ficheros con las instrucciones CreateFile o FileCreate. Estoy programando una aplicacion en la que creo un fichero y despues de crearlo se debe de poder abrir para trabajar con el en cualquier momento. Con las fuciones CreateFile y FileCreate se crea el fichero perfectamente al pasarle la ruta, pero si despues quiero abrirlo (con ShellExecute) en la misma sesion de la aplicacion en la que lo he creado no me deja, en cambio si cierro al aplicacion y vuelvo a abrirla entonces si me deja abrir el fichero que cree en la sesion anterior. Al intentar abrirlo en la misma sesion que lo creo me dice que la ruta no es valida, cuando realmente el fichero esta creado en esa ruta.
¿Se os ocurre algo?
Gracias.

dec 01-09-2006 10:30:26

Hola,

Tal vez es que tengas que cerrar el archivo una vez creado para que puedas a su vez utilizar "ShellExecute" sin problemas. La función para cerrar un archivo es "CloseFile" o "FileClose".

Lo siguiente provocaría el error que mencionas:

Código Delphi [-]
var
  F: Integer;
begin
  F := FileCreate('C:\archivo.txt');
  //FileClose(F);
  ShellExecute(0, 'open', 'C:\archivo.txt', nil, nil, 0);
end;

Pero, con esto otro ya no habrá problemas:

Código Delphi [-]
var
  F: Integer;
begin
  F := FileCreate('C:\archivo.txt');
  FileClose(F);
  ShellExecute(0, 'open', 'C:\archivo.txt', nil, nil, 0);
end;

Si utilizas, empero, la función "CreateFile", entre sus parámetros está "dwShareMode", que te permite indicar la manera de compartir el archivo recién creado, mientras no lo cierres (cuando lo cierres el archivo estará disponible, claro).

Echa un vistazo a la ayuda de la función "CreateFile" del API de Windows:

Cita:

FILE_SHARE_DELETE Windows NT only
Subsequent open operations on the object will succeed only if delete access is requested.

FILE_SHARE_READ
Subsequent open operations on the object will succeed only if read access is requested.

FILE_SHARE_WRITE:

Subsequent open operations on the object will succeed only if write access is requested.
Creo que a ti lo que te interesa la segunda constante.

El siguiente código no produce el error que mencionas, porque se cierra el archivo luego de creado y antes de abrirlo:

Código Delphi [-]
var
  F: Integer;
begin
  F := CreateFile('C:\archivo.txt', GENERIC_READ, 0,
   nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

  FileClose(F);

  ShellExecute(0, 'open', 'C:\archivo.txt', nil, nil, 0);
end;

Pero, tampoco este código produciría error alguno, puesto que se da permiso para leer el archivo, incluso sin que su "descriptor" esté cerrado:

Código Delphi [-]
var
  F: Integer;
begin
  F := CreateFile('C:\archivo.txt', GENERIC_READ, FILE_SHARE_READ,
   nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

  ShellExecute(0, 'open', 'C:\archivo.txt', nil, nil, 0);

  FileClose(F);
end;

nemesio 01-09-2006 14:21:16

Creo que con la explicación que te dio David, sobran las palabras.

Saludos


La franja horaria es GMT +2. Ahora son las 08:23:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi