Files, Streams and the File System

31.1 System.IOUtils (Modern)

uses System.IOUtils, System.Types;

TFile.WriteAllText('notes.txt', 'Hello', TEncoding.UTF8);
TFile.AppendAllText('notes.txt', sLineBreak + 'More');
var Text := TFile.ReadAllText('notes.txt');
var Lines := TFile.ReadAllLines('notes.txt');
TFile.WriteAllBytes('data.bin', Bytes);
if TFile.Exists('notes.txt') then
begin
  TFile.Copy('notes.txt', 'backup.txt', True);
  TFile.Move('backup.txt', TPath.Combine('archive', 'backup.txt'));
  TFile.Delete('notes.txt');
end;
TDirectory.CreateDirectory('output\reports');
for var F in TDirectory.GetFiles('C:\Data', '*.csv', TSearchOption.soAllDirectories) do
  Writeln(TPath.GetFileName(F));
var Docs := TPath.GetDocumentsPath;            // cross-platform (important on mobile)
var Tmp := TPath.GetTempFileName;
var Full := TPath.Combine(TPath.GetHomePath, 'myapp.ini');
Writeln(TPath.GetExtension(Full), ' ', TPath.GetFileNameWithoutExtension(Full));

31.2 Streams

Abstract base (Read, Write, Seek, Position, Size, CopyFrom)

Files (fmCreate, fmOpenRead, fmShareDenyWrite) String ↔ stream with encoding TBytes buffer TBufferedFileStream (10.1+) Buffered file I/O

TZCompressionStream / TZDecompressionStream TStreamReader / TStreamWriter Text reading/writing with encoding TBinaryReader / TBinaryWriter Typed binary I/O

var FS := TFileStream.Create('data.bin', fmCreate);
try
  var W := TBinaryWriter.Create(FS);
  try
    W.Write(Integer(42)); W.Write(3.14); W.Write('text');
  finally
    W.Free;
  end;
finally
  FS.Free;
end;

var Reader := TStreamReader.Create('big.log', TEncoding.UTF8);
try
  while not Reader.EndOfStream do
    if Reader.ReadLine.Contains('ERROR') then Inc(ErrorCount);
finally
  Reader.Free;
end;

31.3 INI Files, Registry and Legacy File I/O

uses System.IniFiles, System.Win.Registry;
var Ini := TMemIniFile.Create(TPath.Combine(TPath.GetDocumentsPath, 'app.ini'), TEncoding.UTF8);
try
  Ini.WriteString('Database', 'Server', 'localhost');
  var Port := Ini.ReadInteger('Database', 'Port', 5432);
  Ini.UpdateFile;
finally
  Ini.Free;
end;

var Reg := TRegistry.Create(KEY_READ);      // Windows only
try
  Reg.RootKey := HKEY_CURRENT_USER;
  if Reg.OpenKeyReadOnly('Software\MyApp') then Writeln(Reg.ReadString('Theme'));
finally
  Reg.Free;
end;

// Classic Pascal text files (legacy)
var F: TextFile;
AssignFile(F, 'old.txt'); Rewrite(F);
try Writeln(F, 'line'); finally CloseFile(F); end;