2012-04-19 17 views
5

Tengo un procedimiento que busca un archivo introducida por el usuario en un camino y subtrazados, tengo una buena comprensión de la mayor parte de él a excepción de esta línea:¿Qué nombres de directorios '.' y '..' significa y ¿qué significa faDirectory?

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

El conjunto procedimiento es el siguiente , la ayuda sería apreciada ya que no estoy seguro exactamente del propósito de esta línea de código, ¿está revisando algo en el subtrayecto ?.

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 

Respuesta

10

1) El attibute faDirectory indica si la entrada es un directorio.

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

2) Cada directorio tiene dos Dot Directory Names, que debe ser evitada en el análisis recursivo.

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

En otras palabras, significa que la línea: analizar sólo si la entrada actual es un directorio y no es un Dot Directory.

+0

entonces (Rec.Attr y faDirectory) devuelve un valor negativo si el elemento TSearchRec actual es un directorio? ¿Por qué es esto? – Alexjjsmith

+4

No, la línea '(Rec.Attr y faDirectory)' usa el operando 'AND' para verificar si el valor' faDirectory' ($ 00000010) se establece en los atributos de la entrada. – RRUZ

+0

veo, muchas gracias. Sé que esta no era la pregunta original, técnicamente debería crear una nueva pregunta, pero me preguntaba si tienes tiempo para sugerirme cómo podría tener un mensaje para indicar que el archivo no se ha encontrado, tengo intentado poner una variable booleana donde la variable FileFound se establece en falso, pero FileFound: = true si FindFirst (Path + FileName, faAnyFile - faDirectory, Rec) = 0; sin embargo, al ser un procedimiento recursivo, no funcionará, cualquier método fácil de lograr ¿eso? – Alexjjsmith

Cuestiones relacionadas