Delphi/TFileStream, czyli zabawa na plikach

TFileStream - prosta klasa do obsługi plików. Zastępuje mało wydajne metody Read oraz Write z Turbo Pascala.


Właściwości

edytuj
  • Handle - identyfikator pliku
  • Position - zwraca linię, bądź znak w pliku (tzw. offset)
  • Size - zwraca wielkość pliku

Podstawowe użycie

edytuj
var
...
Plik: TFileStream;
begin
...
ShowMessage('Wielkosc pliku wynosi: '+IntToStr(Plik.Size)+' bajtow');

Metody

edytuj
  • Create - tworzy obiekt tej klasy. Jako parametry podajemy nazwę pliku oraz tryb otwierania (więcej w pomocy Delphi). Są takie dwie, w drugiej też podajemy prawa dostępu do pliku. Użycie:
constructor Create(const FileName: string; Mode: Word); overload;
constructor Create(const FileName: string; Mode: Word; Rights: Cardinal); overload;
  • Destroy - usuwa taki obiekt; chociaż lepiej użyć Free, która potrafi sprawdzić, czy obiekt nie jest już używany.

Użycie w praktyce

edytuj

Oto prosta procedura czytająca dane z pliku za pomoca TFileStream:

procedure TForm1.Button1Click(Sender: TObject);
var  Plik: TFileStream;
     Buffer: array of byte;
begin                            // 1       // 2
  Plik:=TFileStream.Create('C:\Nazwa.txt', fmCreate); // po zastosowaniu tego parametru //2 plik 'Nazwa.txt' zostanie
                                                      // utworzony jeśli go jeszcze nie ma lub wyczyszczony gdy już  
                                                      // istnieje.

  SetLength(Buffer,4096);            // ustawiamy wielkość pamięci dla pliku na 4096 bajtów (4KB)
  Plik.Read(Buffer[0],4096);         // czytamy 4KB z pliku, bo taki jest bufor

  ShowMessage(IntTostr(Buffer[1])); // wyświetlamy drugi znak z pamięci
  Plik.Free;                         // zwalniamy obiekt klasy; Free wywołuje Destroy
end;

Klasa TFileStream jest bardzo przydatna, gdy chcemy czytać dane z pliku do rekordu:

procedure TForm1.Button2Click(Sender: TObject);
type MyRecord = record
         Str: String[200];
         B: Byte;
         W: Word;
     end;
var
     Plik: TFileStream;
     Rek: MyRecord;
begin
  Plik:=TFileStream.Create('C:\Nazwa.txt',fmCreate);   // z prawami do tworzenia
  Plik.Read(Rek,SizeOf(Rek));         // czytamy do rekordu
  Plik.Free;                          // i usuwamy obiekt
end;

W ten sposób odczytane dane możemy wykorzystywać poprzez:

  ShowMessage(Rek.Str);
  ShowMessage(IntTostr(Rek.B));

lub podobnie...


Dzięki TFileStream możemy zapisywać całe typy danych jedną funkcją:

var ...
    Str: String;
begin
...
Plik.Write(Str, Length(Str)); //zapisujemy string do pliku
Plik.Write(Tab, Sizeof(Tab)); //zapisujemy do pliku tablice nie-dynamiczna
Plik.Write(Tab[0], SizeOf(Tab)); //zapisujmey tablice dynamiczna
Plik.Write(Rek, SizeOf(Rek)); //zapisujemy rekord (lub "packed record")
...

Za pomoca TFileStream łatwo można skopiować plik:

procedure TForm1.CopyTheFile;
var
  NewFile: TFileStream;
  OldFile: TFileStream;
begin
    OldFile := TFileStream.Create('nazwaplikuwejscia', fmOpenRead or fmShareDenyWrite);
    NewFile := TFileStream.Create('nazwaplikuwyjscia', fmCreate or fmShareDenyRead);
    NewFile.CopyFrom(OldFile, OldFile.Size);
    FreeAndNil(NewFile);
    FreeAndNil(OldFile);
end;