Delphi/TFileStream, czyli zabawa na plikach
Z Wikibooks, biblioteki wolnych podręczników.
< Delphi
TFileStream - prosta klasa do obsługi plików. Zastępuje mało wydajne metody Read oraz Write z Turbo Pascala.
Spis treści |
[edytuj] Właściwości
- Handle - identyfikator pliku
- Position - zwraca linię, bądź znak w pliku (tzw. offset)
- Size - zwraca wielkość pliku
[edytuj] Podstawowe użycie
var ... Plik: TFileStream; begin ... ShowMessage('Wielkosc pliku wynosi: '+IntToStr(Plik.Size)+' bajtow');
[edytuj] Metody
- 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.
[edytuj] Użycie w praktyce
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;