Create and/or Write to a file

前端 未结 5 1050
逝去的感伤
逝去的感伤 2021-02-07 01:26

I feel like this should be easy, but google is totally failing me at the moment. I want to open a file, or create it if it doesn\'t exist, and write to it.

The followin

相关标签:
5条回答
  • 2021-02-07 01:53

    You should be using TFileStream instead. Here's a sample that will create a file if it doesn't exist, or write to it if it does:

    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;
    
    0 讨论(0)
  • 2021-02-07 01:56

    Any solution that uses FileExists to choose how to open the file has a race condition. If the file's existence changes between the time you test it and the time you attempt to open the file, your program will fail. Delphi doesn't provide any way to solve that problem with its native file I/O routines.

    If your Delphi version is new enough to offer it, you can use the TFile.Open with the fmOpenOrCreate open mode, which does exactly what you want; it returns a TFileStream.

    Otherwise, you can use the Windows API function CreateFile to open your file instead. Set the dwCreationDisposition parameter to OPEN_ALWAYS, which tells it to create the file if it doesn't already exist.

    0 讨论(0)
  • 2021-02-07 02:02

    You can also use the load/save feature in a TStringList to solve your problem.

    This might be a bad solution, because the whole file will be loaded into memory, modified in memory and then saved to back to disk. (As opposed to your solution where you just write directly to the file). It's obviously a bad solution for multiuser situations.

    But this approach is OK for smaller files, and it is easy to work with and easy understand.

    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;
    
    0 讨论(0)
  • 2021-02-07 02:07

    If you are just doing something simple, the IOUtils Unit is a lot easier. It has a lot of utilities for writing to files.

    e.g.

    procedure WriteAllText(const Path: string; const Contents: string); overload; static;

    Creates a new file, writes the specified string to the file, and then closes the file. If the target file already exists, it is overwritten.

    0 讨论(0)
  • 2021-02-07 02:12

    You can use the FileExists function and then use Append if exist or Rewrite if not.

        AssignFile(logFile, 'Test.txt');
    
        if FileExists('test.txt') then
          Append(logFile)
        else
          Rewrite(logFile);
    
       //do your stuff
    
        CloseFile(logFile); 
    
    0 讨论(0)
提交回复
热议问题