Find files with FindFirst and FindNext (Views: 29)
Problem/Question/Abstract: Find files with FindFirst and FindNext Answer: The procedure FindFiles locates files (by a given "filemask") and adds their complete path to a stringlist. Note that recursion is used: FindFiles calls itself at the end of the procedure! Before calling FindFiles, the stringlist has to be created; afterwards, you must free the stringlist. In StartDir you pass the starting directory, including the disk drive. In FileMask you pass the name of the file to find, or a file mask. Examples: FindFiles('c:\', 'letter01.doc') FindFiles('d:\', 'euroen??.dpr') FindFiles('d:\projects', '*.dpr') If you want to test this procedure, start a new project and add some components to the form: two Edits (one for the starting directory, one for the mask), a Button, a TLabel and a ListBox. implementation .... var FilesList: TStringList; ... procedure FindFiles(StartDir, FileMask: string); var SR: TSearchRec; DirList: TStringList; IsFound: Boolean; i: integer; begin if StartDir[length(StartDir)] <> '\' then StartDir := StartDir + '\'; { Build a list of the files in directory StartDir (not the directories!) } IsFound := FindFirst(StartDir + FileMask, faAnyFile - faDirectory, SR) = 0; while IsFound do begin FilesList.Add(StartDir + SR.Name); IsFound := FindNext(SR) = 0; end; FindClose(SR); // Build a list of subdirectories DirList := TStringList.Create; IsFound := FindFirst(StartDir + '*.*', faAnyFile, SR) = 0; while IsFound do begin if ((SR.Attr and faDirectory) <> 0) and (SR.Name[1] <> '.') then DirList.Add(StartDir + SR.Name); IsFound := FindNext(SR) = 0; end; FindClose(SR); // Scan the list of subdirectories for i := 0 to DirList.Count - 1 do FindFiles(DirList[i], FileMask); DirList.Free; end; procedure TForm1.ButtonFindClick(Sender: TObject); begin FilesList := TStringList.Create; FindFiles(EditStartDir.Text, EditFileMask.Text); ListBox1.Items.Assign(FilesList); LabelCount.Caption := 'Files found: ' + IntToStr(FilesList.Count); FilesList.Free; end; |