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;