Какво означават имената на директории '.' и „..“ означават и какво означава faDirectory?

Имам процедура, която търси файл, въведен от потребителя в пътека и подпътеки, разбирам добре повечето от нея, с изключение на този ред:

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

Цялата процедура е както следва, помощта ще бъде оценена, тъй като не съм сигурен точно за целта на този ред код, проверява ли нещо в подпътеката?.

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

person Jeowkes    schedule 19.04.2012    source източник


Отговори (1)


1) Атрибутът faDirectory показва дали записът е директория .

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

2) Всяка директория има две точкова директория Имена, които трябва да се избягват при рекурсивното сканиране.

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

С други думи този ред означава: сканира само ако текущият запис е директория, а не е Dot Directory.

person RRUZ    schedule 19.04.2012
comment
така че (Rec.Attr и faDirectory) връща отрицателна стойност, ако текущият елемент на TSearchRec е директория? защо е това - person Jeowkes; 20.04.2012
comment
Не, ред (Rec.Attr and faDirectory) използва операнд AND, за да провери дали стойността faDirectory($00000010) е зададена в атрибутите на записа. - person RRUZ; 20.04.2012
comment
разбирам, благодаря много. Знам, че това не беше първоначалният въпрос, технически трябва да създам нов въпрос, но се чудех дали имате време дали бихте могли да ми предложите как мога да получа съобщение за показване, което да показва, че файлът не е намерен, имам се опита да постави булева променлива, където променливата FileFound е настроена на false, но FileFound := true if FindFirst(Path + FileName, faAnyFile - faDirectory, Rec) = 0, но като рекурсивна процедура това няма да работи, всички лесни методи за постигане то? - person Jeowkes; 20.04.2012
comment
Можете да накарате FileSearch() да върне Boolean, указващ дали намира файла при дадена итерация. След като итерация върне True, продължете да предавате True нагоре по рецерсивната верига към първоначалния повикващ. За информация, на XP и по-нови версии има налична функция SearchPath(), която търси име на файл в определен път, така че вече не се налага да търсите ръчно. - person Remy Lebeau; 20.04.2012
comment
Направих това и работи с изключение на факта, че когато се появи съобщението showmessage и натисна OK, то продължава да се появява отново, въпреки че го получих в края на процедурата - person Jeowkes; 20.04.2012