All pastes #258592 Raw Edit

Anonymous

public text v1 · immutable
#258592 ·published 2006-11-26 17:50 UTC
rendered paste body
Procedury FindFirst i FindNext

Procedury FindFirst (znajdź pierwszy) i FindNext (znajdź kolejny) służą do wyszukiwania plików lub katalogów spełniających określone kryteria. Pozwalają na sprawdzenie istnienia pliku lub katalogu, wylistowanie zawartości katalogu lub nawet całego dysku.

Procedura FindFirst posiada trzy następujące argumenty


Procedure FindFirst(Path : String; Attr : Word; Var R : SearchRec);

Pierwszy z nich Path określa ścieżkę dostępu do pliku lub katalogu. Argument ten może zawierać znaki wieloznaczne * i ? - określa wówczas wzorzec nazwy poszukiwanego zbioru, w przypadku przeciwnym, gdy Path nie zawiera znaków wieloznacznych, wskazuje konkretny plik lub katalog.

Przykładowe wywołanie procedury


FindFirst('C:\Autoexec.bat', 0, R);

pozwala stwierdzić czy plik Autoexec.bat istnieje na dysku C: w katalogu głównym. Jeżeli procedura odnajdzie plik to zmienna DosError otrzyma wartość 0, dodatkowo pola rekodu R zawierać będą informacje o tym pliku.
Po błędnym wykonaniu procedury wartość zmiennej DosError jest różna od zera, przy czym wartość 18 oznacza wykonanie poprawne i wskazuje na brak poszukiwanego pliku.

W ten sposób można sprawdzić istnienie dowolnego katalogu


FindFirst('C:\Windows\Temp', Directory, R);
{UWAGA: Nie do końca to prawda...}
If DosError=0 Then WriteLn('Katalog C:\Windows\Temp istnieje');

Parametr Attr określa atrybuty jakie powinien posiadać poszukiwany zbiór i z nimi właśnie związana jest uwaga podana w komentarzu.
Procedura FindFirst bez względu na podane atrybuty zawsze wyszukuje wszystkie pliki zwykłe pasujące do wzorca nazwy. Poprzez pojęcie plik zwykły rozumie się taki plik, który posiada ustawione co najwyżej dwa atrybuty Archive oraz ReadOnly - zbiory z atrybutem ukryty (Hidden), systemowy (SysFile) lub katalog (Directory) nie są plikami zwykłymi. Chcąc odnaleźć taki zbiór należy wyrażnie określić to w parametrze Attr dodając odpowiednią stałą lub skorzystać ze stałej AnyFile. Poniżej podano przykładowe wartości parametru Attr:


Wartość patametru
Określa pliki

0
wszystkie pliki zwykłe

SysFile+Hidden
wszystkie pliki

AnyFile
wszystkie pliki i katalogi oraz etykieta dysku

AnyFile-VolumeID-Directory
wszystkie pliki, oprócz katalogów i etykiety dysku, łacznie z plikami systemowymi i ukrytymi

Directory+SysFile
wszystkie pliki zwykłe i katalogi za wyjątkiem ukrytych, oprócz etykiety dysku



Taki sposób działania procedury FindFirst tłumaczy dlaczego powyższy przykład nie jest do końca poprawny - może się bowiem okazać, że procedura znajdzie w katalogu C:\Windows plik o nazwie Temp - można więc twierdzić na podstawie DosError=0, że znaleziono zbiór, ale niekoniecznie musi być to katalog.
Chcąc za pomocą tej procedury sprawdzić istnienie katalogu należałoby zrobić to w sposób następujący:


FindFirst('C:\Windows\Temp', Directory, R);
If DosError=0 Then
Begin
FindFirst('C:\Windows\Temp', AnyFile-Directory-VolumeID, R);
If DosError<>0 Then
WriteLn('Katalog C:\Windows\Temp istnieje');
End;

- znajd&#378; plik lub katalog i je&#347;li wyst&#281;puje, to ponownie znajd&#378; plik - je&#347;li nie ma takiego pliku, to zbiór znaleziony poprzednio by&#322; katalogiem.