Что означают имена каталогов '.' и «..» и что означает 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
я вижу, спасибо большое. Я знаю, что это не был первоначальный вопрос, технически я должен создать новый вопрос, но мне было интересно, есть ли у вас время, не могли бы вы предложить мне, как я мог бы иметь showmessage, чтобы указать, что мой файл не был найден, у меня есть попытался поместить логическую переменную, где для переменной FileFound установлено значение false, но FileFound := true, если 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
я сделал это, и это работает, за исключением того факта, что когда появляется сообщение о шоу, и я нажимаю «ОК», оно продолжает появляться снова, хотя я получил его в конце процедуры. - person Jeowkes; 20.04.2012