Delphi/TFileStream, czyli zabawa na plikach
< Delphi
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
edytujvar
...
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
edytujOto 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;