我觉得这应该很容易,但谷歌目前完全失败了。我想打开一个文件,或者如果它不存在就创建它,并写入它。
以下
AssignFile(logFile, 'Test.txt');
Append(logFile);
当文件不存在时,在第二行引发错误,我认为这是预期的。但我真的没有找到如何a)测试文件是否存在以及b)在需要时创建它。
仅供参考,在Delphi XE工作。
答案 0 :(得分:36)
您可以使用FileExists
功能,然后使用Append
(如果存在)或Rewrite
(如果不存在)。
AssignFile(logFile, 'Test.txt');
if FileExists('test.txt') then
Append(logFile)
else
Rewrite(logFile);
//do your stuff
CloseFile(logFile);
答案 1 :(得分:24)
使用FileExists
选择如何打开文件的任何解决方案都存在竞争条件。如果文件的存在在您测试它和尝试打开文件的时间之间发生变化,则程序将失败。 Delphi没有提供任何方法来解决其本机文件I / O例程的问题。
如果您的Delphi版本足够新,可以使用TFile.Open
fmOpenOrCreate
开放模式,这完全符合您的要求;它返回TFileStream
。
否则,您可以使用Windows API函数CreateFile
来打开文件。将dwCreationDisposition
参数设置为OPEN_ALWAYS
,告诉它创建文件(如果该文件尚不存在)。
答案 2 :(得分:10)
您应该使用TFileStream
代替。这是一个样本,如果文件不存在,将创建一个文件,如果存在,则写入文件:
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;
答案 3 :(得分:5)
您还可以使用TStringList
中的加载/保存功能来解决问题。
这可能是一个糟糕的解决方案,因为整个文件将被加载到内存中,在内存中修改然后保存到磁盘。 (与您直接写入文件的解决方案相反)。对于多用户情况来说,这显然是一个糟糕的解决方案。
但这种方法适用于较小的文件,并且易于使用且易于理解。
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;
答案 4 :(得分:4)
如果你只是做一些简单的事情,那么IOUtils单元就容易多了。它有很多用于写入文件的实用程序。
e.g。
procedure WriteAllText(const Path:string; const Contents:string); 超载;静态的;
创建新文件,将指定的字符串写入文件,然后 关闭文件。如果目标文件已存在,则会被覆盖。