2012-04-19 7 views
5

mam procedurę, która wyszukuje pliku wprowadzonej przez użytkownika w ścieżce i podścieżek, mam dobre zrozumienie większość z nich z wyjątkiem tej linii:Co oznaczają nazwy katalogów "." i ".." oznacza i co oznacza faDirectory?

if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name<>'.') and (Rec.Name<>'..') 

Cała procedura jest następująca , pomoc byłaby doceniona, ponieważ nie jestem pewien co do celu tej linii kodu, czy sprawdza coś w podścielisku ?.

procedure TfrmProject.btnOpenDocumentClick(Sender: TObject); 
begin 
FileSearch('C:\Users\Guest\Documents', edtDocument.Text+'.docx'); 
end; 

procedure TfrmProject.FileSearch(const Pathname, FileName : string); 
var Word : Variant; 
    Rec : TSearchRec; 
    Path : string; 
begin 
Path := IncludeTrailingBackslash(Pathname); 
if FindFirst(Path + FileName, faAnyFile - faDirectory, Rec) = 0 
then repeat Word:=CreateOLEObject('Word.Application'); 
    Word.Visible:=True; 
    Word.Documents.Open(Path + FileName); 
    until FindNext(Rec) <> 0; 
FindClose(Rec); 


if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then 
try 
    repeat 
    if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name<>'.') and (Rec.Name<>'..') then 
    FileSearch(Path + Rec.Name, FileName); 
    until FindNext(Rec) <> 0; 
finally 
FindClose(Rec); 
end; 

end; //procedure FileSearch 

Odpowiedz

10

1) Atrybut faDirectory wskazuje, czy wpis jest katalogiem.

(Rec.Attr and faDirectory) <> 0 //check if the current TSearchRec element is a directory 

2) Każdy katalog ma dwa Dot Directory Names, których należy unikać w rekurencyjnym skanowania.

(Rec.Name<>'.') and (Rec.Name<>'..') //check the name of the entry to avoid scan when is `.` or `..` 

Innymi słowy tej linii skanowania oznacza: tylko jeśli bieżąca pozycja jest katalogiem i nie jest Dot Directory.

+0

so (Rec.Attr i faDirectory) zwraca wartość ujemną, jeśli bieżący element TSearchRec jest katalogiem? dlaczego jest to – Alexjjsmith

+4

Nie, wiersz '(Rec.Attr i faDirectory)' używa argumentu 'AND' do sprawdzenia, czy wartość' faDirectory' ($ 00000010) jest ustawiona w attibutach wpisu. – RRUZ

+0

Widzę, wielkie dzięki. Wiem, że to nie było oryginalne pytanie, które powinien technicznie utworzyć nowe pytanie, ale zastanawiałem się, czy masz czas, czy możesz mi zasugerować, w jaki sposób mogę mieć komunikat pokazujący, że plik nie został znaleziony, mam próbowano umieścić zmienną boolowską, w której zmienna FileFound ma wartość false, ale FileFound: = true, jeśli FindFirst (Path + FileName, faAnyFile - faDirectory, Rec) = 0, jednak będąc procedurą rekurencyjną, to nie zadziała, wszelkie łatwe metody osiągnięcia to? – Alexjjsmith