下面的两个函数,FilesInDir用于寻找指定目录下的文件,DirsInDir用于寻找指定目录下的目录。function FilesInDir(Dir: string; Mask: string; var FileNames: TStringList): boolean; //Find File in Dir var FindHandle: THandle; FindData: Win32_Find_Data; procedure Add; begin if FileExists(Dir + FindData.cFileName) and (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0) and (FindData.dwFileAttributes and FILE_ATTRIBUTE_OFFLINE = 0) and (FindData.dwFileAttributes and FILE_ATTRIBUTE_TEMPORARY = 0) then FileNames.Add(FindData.cFileName); end; begin Result := false; Dir := IncludeTrailingBackslash(Dir); FileNames.Clear; FindHandle := FindFirstFile(PChar(Dir + Mask), FindData); if FindHandle <> 0 then begin Add; While FindNextFile(FindHandle, FindData) do Add; Windows.FindClose(FindHandle); if FileNames.Count > 0 then Result := true; end; end;function DirsInDir(Dir: string; Mask: string; var DirNames: TStringList): boolean; //Find Directory in Dir //Update on var FindHandle: THandle; FindData: Win32_Find_Data; procedure Add; begin if FileExists(Dir + FindData.cFileName) and (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0) and (FindData.dwFileAttributes and FILE_ATTRIBUTE_OFFLINE = 0) and (FindData.dwFileAttributes and FILE_ATTRIBUTE_TEMPORARY = 0) then DirNames.Add(FindData.cFileName); end; begin Result := false; DirNames.Clear; FindHandle := FindFirstFile(PChar(Dir + Mask), FindData); if FindHandle <> 0 then begin Add; While FindNextFile(FindHandle, FindData) do Add; Windows.FindClose(FindHandle); if DirNames.Count > 0 then Result := true; end; end;
用的着那么麻烦吗? 我觉得用两个函数FindFirst和FindNext足以搞定。 for example: procedure GetSubDir; var DirInfo: TSearchRec; begin if findfirst('XXX\*.*',faDirectory,DirInfo)=0 then 将DirInfo.Name保存到数组; while findnext('XXX\*.*',faDirectory,DirInfo) = 0 do begin 将DirInfo.Name保存到数组 end;end;
path:='.\myfile\'; found:=FindFirst(path+'*.*',faAnyFile,SearchRec); while found=0 do begin if (SearchRec.Name<>'.')and(SearchRec.Name<>'..')and(SearchRec.Attr<>faDirectory) then with Treeview1.Items.addchild(nil,searchRec.name) do begin ImageIndex:=0; end; found:=FindNext(SearchRec); end; FindClose(SearchRec);
http://www.csdn.net/dev/Delphi/
找 tree.zip
//Find File in Dir
var
FindHandle: THandle;
FindData: Win32_Find_Data;
procedure Add;
begin
if FileExists(Dir + FindData.cFileName)
and (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0)
and (FindData.dwFileAttributes and FILE_ATTRIBUTE_OFFLINE = 0)
and (FindData.dwFileAttributes and FILE_ATTRIBUTE_TEMPORARY = 0)
then
FileNames.Add(FindData.cFileName);
end;
begin
Result := false;
Dir := IncludeTrailingBackslash(Dir);
FileNames.Clear;
FindHandle := FindFirstFile(PChar(Dir + Mask), FindData);
if FindHandle <> 0 then begin
Add;
While FindNextFile(FindHandle, FindData) do Add;
Windows.FindClose(FindHandle);
if FileNames.Count > 0 then Result := true;
end;
end;function DirsInDir(Dir: string; Mask: string; var DirNames: TStringList): boolean;
//Find Directory in Dir
//Update on
var
FindHandle: THandle;
FindData: Win32_Find_Data;
procedure Add;
begin
if FileExists(Dir + FindData.cFileName)
and (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0)
and (FindData.dwFileAttributes and FILE_ATTRIBUTE_OFFLINE = 0)
and (FindData.dwFileAttributes and FILE_ATTRIBUTE_TEMPORARY = 0)
then
DirNames.Add(FindData.cFileName);
end;
begin
Result := false;
DirNames.Clear;
FindHandle := FindFirstFile(PChar(Dir + Mask), FindData);
if FindHandle <> 0 then begin
Add;
While FindNextFile(FindHandle, FindData) do Add;
Windows.FindClose(FindHandle);
if DirNames.Count > 0 then Result := true;
end;
end;
我觉得用两个函数FindFirst和FindNext足以搞定。
for example:
procedure GetSubDir;
var
DirInfo: TSearchRec;
begin
if findfirst('XXX\*.*',faDirectory,DirInfo)=0 then
将DirInfo.Name保存到数组;
while findnext('XXX\*.*',faDirectory,DirInfo) = 0 do
begin
将DirInfo.Name保存到数组
end;end;
found:=FindFirst(path+'*.*',faAnyFile,SearchRec);
while found=0 do
begin
if (SearchRec.Name<>'.')and(SearchRec.Name<>'..')and(SearchRec.Attr<>faDirectory)
then
with Treeview1.Items.addchild(nil,searchRec.name) do
begin
ImageIndex:=0;
end;
found:=FindNext(SearchRec);
end;
FindClose(SearchRec);