Delphi __ Kompendium __ Roz7.pdf

(1552 KB) Pobierz
Delphi :: Kompendium :: Roz...
Delphi :: Kompendium :: Rozdział 7 - 4programmers.net
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_7
Logowanie | Rejestracja | Forum | Pomoc | Reklama
Strona główna :: Delphi :: Kompendium
Rozdział 7
Edytuj Historia
Obsługa plików
Czym jest plik? Tego chyba nie trzeba wyjaśniać żadnemu użytkownikowi komputera. Istnieje kilka rodzajów
plików: tekstowe, binarne, typowane itp. Pliki są wykorzystywane przez programy do pobierania lub
przechowywania informacji; mogą też zawierać binarne fragmenty programu. Ten rozdział będzie poświęcony
plikom i ich obsłudze w Delphi. Zaczniemy od rzeczy najprostszych, przechodząc do coraz bardziej
zaawansowanych aspektów. Nie będzie to jednak coś, co przysporzy Ci bólu głowy ? obsługa plików nie jest
trudna. Wystarczy tylko znać kilka podstawowych poleceń.
Spis treści
1 Pliki tekstowe
1.1 Inicjalizacja
1.2 Tworzenie nowego pliku
1.3 Otwieranie istniejącego pliku
1.4 Odczyt plików tekstowych
1.5 Zapis nowych danych w pliku
1.6 Zapis danych na końcu pliku
2 Pliki amorficzne
2.1 Otwieranie i zamykanie plików
2.2 Tryb otwarcia pliku
2.3 Zapis i odczyt danych
2.4 Przykład działania ? kopiowanie plików
3 Inne funkcje operujące na plikach
3.1 FilePos
3.2 FileSize
3.3 Seek
3.4 Truncate
3.5 Rename
3.6 RemoveFile
3.7 Operacje na ścieżkach plików
4 Funkcje operujące na katalogach
4.1 mkDir
4.2 rmDir
4.3 RemoveDirectory
5 Pliki typowane
5.1 Deklaracja
5.2 Tworzenie pliku i dodawanie danych
5.3 Odczyt rekordu z pliku
5.4 Przykład działania ? książka adresowa
5.4.1 Projektowanie interfejsu
5.4.2 Założenia programu
5.4.3 Procedura ReadFile
5.4.4 Kasowanie elementu
6 Kopiowanie i przenoszenie plików
6.1 Kopiowanie
6.2 Przenoszenie pliku
6.3 Struktura TSHFileOpStruct
7 Strumienie
7.1 Podział strumieni
7.2 Prosty przykład na początek
7.3 Konstruktor klasy TFileStream
7.4 Pozostałe metody i właściwości klasy TStream
7.4.1 Właściwości
7.4.1.1 Position
7.4.1.2 Size
7.4.2 Metody
7.4.2.1 CopyFrom
1 z 38
2009-03-14 15:35
77980937.007.png 77980937.008.png 77980937.009.png 77980937.010.png 77980937.001.png 77980937.002.png
Delphi :: Kompendium :: Rozdział 7 - 4programmers.net
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_7
7.4.2.2 Read, ReadBuffer
7.4.2.3 Seek
7.4.2.4 Write, WriteBuffer
7.5 Praktyczny przykład
7.5.1 Rzut okiem na interfejs programu
7.5.2 Kod źródłowy programu
8 Wyszukiwanie
8.1 Rekord TSearchRec
8.2 Jak zrealizować wyszukiwanie?
8.2.1 FindFirst
8.2.2 FindNext
8.2.3 FindClose
8.3 Rekurencja
9 Praktyczny przykład
9.1 Wyszukiwanie plików
10 Informacja o dyskach
10.1 Pobieranie listy napędów
10.2 Pobieranie rozmiaru dysku
10.3 Pobieranie dodatkowych informacji
11 Podsumowanie
RSS
Regulamin
cookies
Kontakt
W tym rozdziale:
nauczysz się korzystać z podstawowych funkcji operujących na plikach tekstowych;
dowiesz się, w jaki sposób można kopiować, kasować czy przenosić swoje pliki;
nauczysz się korzystać ze strumieni;
stworzysz swoją pierwszą wyszukiwarkę oraz nauczysz się tworzyć listę plików znajdujących się w
danym katalogu;
dowiesz się, na czym polega algorytm rekurencji.
Pliki tekstowe
Podstawowym rodzajem plików są pliki tekstowe, których budowa jest bardzo prosta. Pliki tekstowe zawierają
wyłącznie tekst, którego kolejne wiersze są oddzielone znakami nowego wiersza.
Inicjalizacja
Zanim stworzymy nowy plik lub otworzymy już istniejący, wymagana jest jego inicjalizacja. W rzeczywistości
jest to przypisanie konkretnego pliku do jakiejś zmiennej, a realizuje to polecenie AssignFile. Wygląda to tak:
var
TF : TextFile ;
begin
AssignFile ( TF, ?C:\plik. txt ? ) ;
{ dalsze operacje }
end ;
Wywołanie procedury wbudowanej AssignFile powoduje skojarzenie zmiennej tekstowej ? TX z plikiem
C:\plik.txt . Taka konstrukcja jest wymagana, aby rozpocząć dalszą pracę z plikiem. Pierwszy parametr musi
być zmienną typu TextFile , a kolejny to ścieżka pliku.
Funkcja AssignFile , jak i inne tego typu należą do funkcji wbudowanych. Oznacza to, że
ich deklaracja znajduje się w module System, który jest automatycznie włączany do
każdego projektu.
Tworzenie nowego pliku
Za tworzenie nieistniejącego wcześniej pliku odpowiada funkcja Rewrite . Jest to również funkcja systemowa,
której nagłówek przedstawia się następująco:
procedure Rewrite ( var F: File [ ; Recsize: Word ] ) ;
Pierwszym parametrem musi być nazwa zmiennej plikowej ? w naszym przypadku będzie to TextFile . Drugim
parametrem na razie się nie przejmuj, gdyż jest on opcjonalny. Tak się składa, że jedna funkcja (w tym
wypadku ? Rewrite ) może być wykorzystywana do otwierania kilku rodzajów plików ? w takiej właśnie sytuacji
jest wykorzystywany ten drugi parametr.
Oto przykład utworzenia nowego pliku tekstowego:
2 z 38
2009-03-14 15:35
77980937.003.png
Delphi :: Kompendium :: Rozdział 7 - 4programmers.net
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_7
procedure TMainForm. btnRewriteClick ( Sender: TObject ) ;
var
TF : TextFile ;
begin
AssignFile ( TF, 'C:\plik.txt' ) ;
try
Rewrite ( TF ) ;
finally
CloseFile ( TF ) ;
end ;
end ;
Copyright © 2000-2006 by Coyote
Group 0.9.3-pre3
Czas generowania strony: 3.0387 sek.
(zapytań SQL: 12)
Na wszelki wypadek cały kod umieściłem w bloku try..finally . Dzięki temu
zawsze ? bez względu na to, czy podczas tworzenia pliku wystąpi jakiś błąd ?
wykonana zostanie instrukcja CloseFile , zwalniająca zmienną TF .
Listing powyższego programu możesz znaleźć na dołączonej do
książki płycie CD-ROM w katalogu ..listingi/7/Create File.
Otwieranie istniejącego pliku
Jeżeli jakiś plik tekstowy już istnieje, to w celu dalszej edycji należy go otworzyć
poleceniem Reset .
procedure Reset ( var F [ : File ; RecSize: Word ] ) ;
Pierwszy parametr to ? tak samo jak w przypadku polecenia Rewrite ? nazwa
zmiennej typu TextFile . Drugi parametr jest parametrem opcjonalnym,
identycznie jak w przypadku funkcji Rewrite .
procedure TMainForm. btnResetClick ( Sender: TObject ) ;
var
TF : TextFile ;
begin
AssignFile ( TF, 'C:\plik2.txt' ) ;
try
Reset ( TF ) ;
finally
CloseFile ( TF ) ;
end ;
end ;
Należy uważać na to, czy plik, który próbujemy otworzyć, istnieje. W przeciwnym
wypadku program wygeneruje wyjątek EFileNotFound , co zazwyczaj skończy się
wyświetleniem komunikatu o błędzie. W takiej sytuacji przydaje się funkcja
FileExists, która sprawdza istnienie podanego w parametrze pliku.
if FileExists ( 'C:\plik.txt' )
Reset ( TF )
else Rewrite ( TF ) ;
Jeżeli plik istnieje, zostanie otwarty, a w przeciwnym wypadku ? utworzony.
Odczyt plików tekstowych
Pamiętasz, jak we wcześniejszych fragmentach książki (a dokładnie w rozdziale
drugim) wspominałem o funkcjach Read i Readln ? Te dwie funkcje służą także do
odczytywania informacji z plików tekstowych. Spójrz na poniższy fragment kodu:
procedure TMainForm. btnResetClick ( Sender: TObject ) ;
var
TF : TextFile ;
S : String ; // zmienna tymczasowa
begin
AssignFile ( TF, 'C:\plik.txt' ) ;
try
Reset ( TF ) ;
3 z 38
2009-03-14 15:35
77980937.004.png
Delphi :: Kompendium :: Rozdział 7 - 4programmers.net
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_7
{ pętla odczytuje kolejne wiersze pliku tekstowego }
while not Eof ( TF ) do
begin
Readln ( TF, S ) ; // odczytanie wierszy i przypisanie zawartości
do zmiennej S
memFile. Lines . Add ( S ) ;
end ;
finally
CloseFile ( TF ) ;
end ;
end ;
end .
Oprócz użycia standardowych procedur Read i Readln skorzystałem także z funkcji
Eof . Funkcja Eof informuje o napotkaniu końca pliku podczas odczytywania jego
zawartości. A zatem pętla w powyższym kodzie będzie wykonywana, dopóki nie
zostaną odczytane wszystkie wiersze pliku tekstowego.
Pierwszym parametrem procedury Readln musi być nazwa zmiennej typu
TextFile . Drugi parametr to zmienna typu String , do której przypisana zostanie
zawartość wiersza.
Po uruchomieniu programu zostanie wyświetlone okno przedstawione na rysunku
7.1.
Rysunek 7.1. Zawartość pliku wczytana do komponentu TMemo
Prawdopodobnie rzadko będziesz używał takiego zapisu, gdyż VCL posiada własne
funkcje służące do przetwarzania plików tekstowych. Zamiast stosować ten ? dość
skomplikowany ? zapis można wykorzystać taki sposób:
Memo. Lines . LoadFromFile ( 'C:\plik.txt' ) ;
Okazuje się, że jednym wierszem kodu można zastąpić szereg wbudowanych
instrukcji języka Object Pascal.
Zapis nowych danych w pliku
Gdy chcemy zapisać nowe dane w pliku, należy skorzystać z funkcji Writeln i
Write . Wspominałem o nich już w rozdziale drugim, ale tym razem ich użycie ?
choć podobne ? nieznacznie się różni.
Pierwszy parametr musi być wskazaniem na zmienną typu TextFile , natomiast
parametr drugi to zmienna typu String .
Writeln ( TF, S ) ;
Oto przykład na udoskonalenie programu, który zaprezentowany został w
poprzednim podpunkcie. Tym razem procedura umożliwia zapis danych z
komponentu TMemo :
procedure TMainForm. btnSaveClick ( Sender: TObject ) ;
var
4 z 38
2009-03-14 15:35
77980937.005.png
Delphi :: Kompendium :: Rozdział 7 - 4programmers.net
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_7
TF : TextFile ;
i : Integer ;
begin
AssignFile ( TF, 'C:\plik.txt' ) ;
try
Rewrite ( TF ) ;
for I := 0 to memFile. Lines . Count ? 1 do
Writeln ( TF, memFile. Lines [ i ]) ;
finally
CloseFile ( TF ) ;
end ;
end ;
Powyższy kod powoduje zapisanie wszystkich wierszy z komponentu TMemo do
pliku tekstowego. Właściwość Count klasy TStrings (właściwość Lines
komponentu TMemo jest typu TStrings ! Tak, całe VCL jest ze sobą połączone!)
zwraca ilość wierszy znajdujących się w komponencie.
Zamiast instrukcji Writeln możesz zastosować także Write .
Różnica pomiędzy tymi dwoma poleceniami polega na tym, że
to drugie polecenie nie dodaje na końcu tekstu znaku nowego
wiersza. W konsekwencji tekst nie będzie podzielony na
wiersze, ale wszystko zostanie zapisane w jednym ciągu.
Zapis danych na końcu pliku
Niekiedy przytrafia się sytuacja, w której chcemy zapisać jakieś dane do pliku, ale
umieszczając je tylko na jego końcu. W takim wypadku przydatna staje się
funkcja Append. Za jej pomocą możliwe jest otwarcie pliku i ustawienie punktu
zapisu na jego końcu.
W praktyce wygląda to tak:
procedure TMainForm. btnAppendClick ( Sender: TObject ) ;
var
TF : TextFile ;
begin
AssignFile ( TF, 'C:\plik.txt' ) ;
try
Append ( TF ) ;
Writeln ( TF, edtText. Text ) ;
finally
CloseFile ( TF ) ;
end ;
end ;
Polecenie Append jednocześnie powoduje otwarcie pliku ? nie jest więc konieczne
wcześniejsze zastosowanie procedury Reset .
Nie istnieją funkcje umożliwiające przemieszczanie się po
plikach tekstowych w przód lub w tył.
Pliki amorficzne
W tym rozdziale plikami amorficznymi będę nazywał pliki o nieregularnej
budowie, czyli pliki binarne. Napisałem nieregularnej, gdyż pliki amorficzne nie
mają określonej budowy, a ich poszczególne wiersze nie są zakończone znakiem
nowego wiersza czy jakimś innym specyficznym znakiem.
Obsługa plików binarnych może się przydać do odczytu fragmentów danych, ich
zapisu lub skopiowania do innego pliku. Przykładem może być odczyt części
danych z pliku mp3 (tzw. tag ? informacja o wykonawcy, tytule piosenki itp.).
Obsługa tych operacji z poziomu Delphi jest raczej prosta; nazwy funkcji są takie
same, jak w przypadku plików testowych, choć istnieją polecenia specyficzne
właśnie dla plików amorficznych.
Otwieranie i zamykanie plików
Otwieranie oraz zamykanie pliku amorficznego realizowane jest także przez
5 z 38
2009-03-14 15:35
77980937.006.png
Zgłoś jeśli naruszono regulamin