创建和/或写入文件

时间:2011-10-20 02:27:59

标签: delphi delphi-xe

我觉得这应该很容易,但谷歌目前完全失败了。我想打开一个文件,或者如果它不存在就创建它,并写入它。

以下

AssignFile(logFile, 'Test.txt');
Append(logFile);
当文件不存在时,

在第二行引发错误,我认为这是预期的。但我真的没有找到如何a)测试文件是否存在以及b)在需要时创建它。

仅供参考,在Delphi XE工作。

5 个答案:

答案 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);   超载;静态的;

     

创建新文件,将指定的字符串写入文件,然后   关闭文件。如果目标文件已存在,则会被覆盖。