Operacje na Plikach
Typy plików
•
Pliki tekstowe
•
Pliki typowane
•
Pliki strumieniowe
•
Pliki amorficzne
Pliki tekstowe
•
Struktura danych (zewnętrzna) zawierających tekst
•
Ogranicznikiem każdego wiersza jest znak o kodzie
ASCII #13
•
Typ danych TextFile
•
Otwieranie pliku: skojarzenie zmiennej typu TextFile
ze ścieżką dostępu, za pomocą procedury AssignFile
•
Po otwarciu uzyskujemy
uchwyt
uchwyt do pliku
•
Od tej pory możemy korzystać z pliku
•
Należy zdecydować, czy plik otwieramy tylko do
odczytu, czy też do zapisu
•
Po zakończeniu korzystania z pliku, należy go zwolnić
(zamknąć) za pomocą procedury CloseFile
Operowanie na pliku
tekstowym
•
Procedura reset – otwarcie do odczytu
•
Procedura rewrite – otwarcie do zapisu
•
Funkcja FileExists (typu Boolean)
•
Procedury read, write, readln, writeln
•
Przykład: Project1
•
Polecenie Append nie usuwa pliku;
umożliwia dopisywanie do niego nowych
informacji
Pliki typowane
•
Zwane też rekordowymi
•
Konieczne zdefiniowanie typu rekordowego
–
Najlepiej spakowanego (packed)
–
Zagnieżdżone łańcuchy znaków powinny mieć określony
maksymalny rozmiar
•
Powiązanie typu rekordowego z typem plikowym (file
of)
•
Funkcja FileSize wyznacza rozmiar pliku (liczbę
rekordów)
•
Funkcja FilePos wyznacza numer bieżącego rekordu
•
Funkcja Seek wyszukuje określony rekord, np.
Seek(DataBase, FileSize(DataBase))
•
Przykład: Project2
Pliki strumieniowe
•
Pliki typowane nie wymagają VCL
•
Abstrakcyjna klasa TStream; podklasy
–
TFileStream – do operowania na plikach
–
TStringStream – na łańcuchach tekstowych
–
TMemoryStream – na danych w pamięci
operacyjnej
–
TResourceStream – na zasobach
•
Strumienie obejmują dane składające się z
bajtów
•
Dane mogą być przesyłane między: pamięcią,
plikami, zasobami itp.
Operowanie na plikach
strumieniowych
var potok: TFileStream;
potok:=TFileStream.Create(‘C:\ustawienia’,
fmOpenRead);
•
Tryb otwarcia
–
fmCreate – utworzenie nowego pliku
–
fmOpenRead – otwarcie tylko do odczytu
–
fmOpenWrite – zapis
–
fmOpenReadWrite – odczyt + zapis
–
fmShareExclusive – inna aplikacja nie może otworzyć pliku
–
fmShareDenyWrite – inna aplikacja może tylko czytać plik
–
fmShareDenyRead - odpowiednio
Przykład operowania na
strumieniach
•
Cel: zapamiętywanie ustawienia
komponentu formularza
•
Klasa TFileStream
•
Jej metoda WriteComponentRes
zapisuje ustawienia wybranego
komponentu w pliku .RES
•
Przykład:
StreamComponentSave.exe
Pliki amorficzne
•
Pliki amorficzne (ang. untyped file) są plikami bez struktury;
pliki binarne
•
Odczytujemy z nich bajty lub inną określona porcję danych
(ziarno)
var fFile: File;
•
Dostępne funkcje podobne do funkcji plików tekstowych
•
Zapis i odczyt danych odbywa się jednak za pomocą procedur:
BlockWrite i BlockRead
•
Procedury Reset i Rewrite wymagają drugiego argumentu
(liczba porcji danych odczytywanych jednocześnie); wartością
domyślna jest 128
•
Argumenty BlockRead: plik (zmienna typu File), bufor danych,
liczba danych do odczytu, opcjonalny argument – liczba
faktycznie odczytanych bajtów
•
Przykład: Project3
Operacje ogólne
•
Kopiowanie plików
CopyFile(‘C:\Plik1.pas’,’C:\Plik2.pas,true);
•
Ścieżka źródłowa, docelowa, czy zastąpić istniejący
plik o tej samej nazwie
MoveFile(‘C:\Plik1.pas’,’C:\Plik2.pas);
•
Bardziej uniwersalne podejście – skorzystanie z
WinAPI (m.in. możliwość kopiowania całych folderów)
–
Konieczność dodania modułu ShellAPI w klauzuli uses
–
Wypełnienie rekordu, np. S, typu TSHFileOpStruct
zawierającego parametry żądanej operacji
–
Wykonanie operacji ShFileOperation(S);
•
mkDir(‘C:\nowy_folder); rmDir ...
Korzystanie z WinAPI
var
S: TSHFileOpStruct;
begin
S.Wnd:=Handle; //uchwyt głównego formularza
S.wFunc := FO_COPY; operacja kopiowania
S.pFrom := ‘C:\File1.src’ // folder (plik) źródłowy
S.pTo := ‘D:\File1.src’ //folder docelowy
S.fFlags := FOF_NOCONFIRMATION or
FOF_RENAMEONCOLLISION or FOF_SIMPLEPROGRESS;
S.fAnyOperationsAborted := true; //jest możliwość anulowania?
S.lpszProgressTitle := ‘Kopiowanie w toku’ //tekst
ShFileOperation(S); //wykonaj
end;
Korzystanie z WinAPI
(c.d.)
•
Flagi operacji
–
FO_COPY –
kopiowanie
–
FO_DELETE –
usunięcie pliku
(katalogu) pFrom
–
FO_MOVE –
przeniesienie
–
FO_RENAME
•
Opcje
–
FOF_ALLOWUNDO – możliwe cofnięcie
operacji
–
FOF_FILESONLY – dotyczy plików z
folderu, a nie podfolderów
–
FOF_NOCONFIRMATION –
niewyświetlanie potweirdzeń
–
FOF_NOCONFIRMMKDIR – nie tworzy
nowego folderu jeżeli operacja tego
wymaga
–
FOF_SILENT – okno kopiowania nie
zostanie wyświetlone
–
FOF_SIMPLEPROGRESS – wyświetla
wskazany tekst (ostatnie pole), ale nie
wyświetla kopiowanego pliku
–
FOF_RENAMECOLISSION – w
przypadku istnienia pliku o tej samej
nazwie, jego nazwa jest zmieniana
Wyszukiwanie plików
•
Funkcje FindFirst i FindNext (SysUtils.pas)
•
Rekord, w którym są przechowywane informacje o
znalezionym pliku
type
TSearchRec=record
Time: integer; //czas utworzenia pliku
Size: integer; //rozmiar
Attr: integer; //atrybuty
Name: TFileName; //nazwa
ExcludeAttr: integer;
FindHandle: Thandle;
FindData: TWin32FindData;
end;
Wyszukiwanie plików
(c.d.)
•
Atrybuty plików
–
faReadOnly – tylko do
odczytu
–
faHidden – ukryty
–
faSysVolume –
systemowy
–
faVolumeID – etykieta
woluminu
–
faDirectory – folder
–
faArchive –
zarchiwizowany
–
faAnyFile – dowolny plik
•
Rozpoczęcie wyszukiwania
FindFirst(‘C:\Folder\*.*’,
faDirectory, DR)
•
Ostatni parametr – nazwa
zmiennej typu TSearchRec
•
Zakończenie
FindClose(DR)
•
FindFirst wyznacza 0, gdy
wyszukiwanie się powiodło
Przykład: pobranie listy
plików z folderu
procedure TMainForm.btnFindClick (Sender: Tobject);
var
SR: TSearchRec;
Found: integer;
begin
Found:=FindFirst(‘C:\folder\*.*’, faAnyFile, SR);
while Found = 0 do
begin
Memo1.Lines.Add(SR.Name);
Found:=FindNext(SR);
end;
FindClose(SR);
end;