versiones full embarcadero edition descargar community borland delphi delphi-xe

full - embarcadero delphi



Crear y/o escribir en un archivo (5)

Cualquier solución que use FileExists para elegir cómo abrir el archivo tiene una condición de carrera. Si la existencia del archivo cambia entre el momento en que lo prueba y el momento en que intenta abrir el archivo, su programa fallará. Delphi no proporciona ninguna forma de resolver ese problema con sus rutinas nativas de E / S de archivos.

Si su versión de Delphi es lo suficientemente nueva como para ofrecerla, puede usar TFile.Open con el modo abierto fmOpenOrCreate , que hace exactamente lo que usted desea; devuelve un TFileStream .

De lo contrario, puede usar la función API de Windows CreateFile para abrir su archivo. Establezca el parámetro dwCreationDisposition en OPEN_ALWAYS , que le indica que cree el archivo si aún no existe.

Siento que esto debería ser fácil, pero Google me está fallando por completo en este momento. Quiero abrir un archivo, o crearlo si no existe, y escribir en él.

El seguimiento

AssignFile(logFile, ''Test.txt''); Append(logFile);

arroja un error en la segunda línea cuando el archivo aún no existe, que supongo que se espera. Pero realmente estoy fallando en descubrir cómo a) probar si el archivo existe yb) crearlo cuando sea necesario.

FYI, trabajando en Delphi XE.


Deberías usar TFileStream en TFileStream lugar. Aquí hay una muestra que creará un archivo si no existe, o escribirá si lo hace:

var FS: TFileStream; sOut: string; i: Integer; Flags: Word; begin Flags := fmOpenReadWrite; if not FileExists(''D:/Temp/Junkfile.txt'') then Flags := Flags or fmCreate; FS := TFileStream.Create(''D:/Temp/Junkfile.txt'', Flags); try FS.Position := FS.Size; // Will be 0 if file created, end of text if not sOut := ''This is test line %d''#13#10; for i := 1 to 10 do begin sOut := Format(sOut, [i]); FS.Write(sOut[1], Length(sOut) * SizeOf(Char)); end; finally FS.Free; end; end;


Puede usar la función FileExists y luego usar Append if exists o Rewrite si no.

AssignFile(logFile, ''Test.txt''); if FileExists(''test.txt'') then Append(logFile) else Rewrite(logFile); //do your stuff CloseFile(logFile);


Si solo está haciendo algo simple, la Unidad IOUtils es mucho más fácil. Tiene muchas utilidades para escribir en archivos.

p.ej

procedimiento WriteAllText (const Path: string; const Contents: string); sobrecarga; estático;

Crea un nuevo archivo, escribe la cadena especificada en el archivo y luego cierra el archivo. Si el archivo de destino ya existe, se sobrescribe.


También puede usar la función de cargar / guardar en una TStringList para resolver su problema.

Esta podría ser una mala solución, ya que todo el archivo se cargará en la memoria, se modificará en la memoria y luego se guardará para volver al disco. (A diferencia de su solución en la que solo escribe directamente en el archivo). Obviamente es una mala solución para situaciones multiusuario.

Pero este enfoque está bien para archivos más pequeños, y es fácil de trabajar y fácil de entender.

const FileName = ''test.txt''; var strList: TStringList; begin strList := TStringList.Create; try if FileExists(FileName) then strList.LoadFromFile(FileName); strList.Add(''My new line''); strList.SaveToFile(FileName); finally strList.Free; end; end;