使用归递调用法,进行遍历目录,需要用FindFirstFile和FindNextFile进行搜索文件。
C++ Builder源码,delphi可以仿制:
#include <vcl.h>
#include <stdio.h>char CurrentDirectoryBuffer[256];
char OldDirectoryBuffer[256];
bool GetDirList(TStringList *TDirStr);
DWORD dwSize,dwFiles;
bool GetDirList(TStringList *TDirStr)
{
WIN32_FIND_DATA FindData;
HANDLE FindHandle;
GetCurrentDirectory(255,CurrentDirectoryBuffer);
FindHandle=FindFirstFile("*.*",&FindData);
if(FindHandle==INVALID_HANDLE_VALUE) return false;
do{
if(!(FindData.dwFileAttributes&FILE_ATTRIBUTE_ENCRYPTED)&&
!(FindData.dwFileAttributes&FILE_ATTRIBUTE_TEMPORARY)&&
!(FindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)&&
!(FindData.dwFileAttributes&FILE_ATTRIBUTE_SPARSE_FILE)&&
!(FindData.dwFileAttributes&FILE_ATTRIBUTE_REPARSE_POINT)&&
!(FindData.dwFileAttributes&FILE_ATTRIBUTE_COMPRESSED)&&
!(FindData.dwFileAttributes&FILE_ATTRIBUTE_OFFLINE)){// printf("%s\\%s\n",CurrentDirectoryBuffer,FindData.cFileName);
dwFiles++;
dwSize+=FindData.nFileSizeLow; if(TDirStr){
if(CurrentDirectoryBuffer[lstrlen(CurrentDirectoryBuffer)-1]!='\\')
TDirStr->Add((AnsiString)CurrentDirectoryBuffer+"\\"+(AnsiString)FindData.cFileName);
else
TDirStr->Add((AnsiString)CurrentDirectoryBuffer+(AnsiString)FindData.cFileName);}}}
while(FindNextFile(FindHandle,&FindData));
FindClose(FindHandle);
FindHandle=FindFirstFile("*.*",&FindData);
if(FindHandle==INVALID_HANDLE_VALUE) return false;
do{
if(FindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY&&
FindData.cFileName[0]!='.'){
if(CurrentDirectoryBuffer[lstrlen(CurrentDirectoryBuffer)-1]!='\\')
lstrcat(CurrentDirectoryBuffer,"\\");
lstrcat(CurrentDirectoryBuffer,FindData.cFileName);
SetCurrentDirectory(CurrentDirectoryBuffer);
GetDirList(TDirStr);
SetCurrentDirectory("..");
GetCurrentDirectory(255,CurrentDirectoryBuffer);}}
while(FindNextFile(FindHandle,&FindData));
FindClose(FindHandle);
return true;
}
void GetDirLists(LPCSTR lpPath,TStringList *TDirStr)
{
MessageBeep(MB_OK);
GetCurrentDirectory(255,OldDirectoryBuffer);
SetCurrentDirectory(lpPath);
GetDirList(TDirStr);
SetCurrentDirectory(OldDirectoryBuffer);
}
void main()
{
TStringList *TDirStr;
int i;
TDirStr=new TStringList;
TDirStr->Clear();
GetDirLists("c:\\",TDirStr);
for(i=0;i<TDirStr->Count;i++)
printf("%s\n",TDirStr->Strings[i].c_str());
printf("Total %ld file(s) %ld Byte(s)\n",dwFiles,dwSize);
delete TDirStr;
}
C++ Builder源码,delphi可以仿制:
#include <vcl.h>
#include <stdio.h>char CurrentDirectoryBuffer[256];
char OldDirectoryBuffer[256];
bool GetDirList(TStringList *TDirStr);
DWORD dwSize,dwFiles;
bool GetDirList(TStringList *TDirStr)
{
WIN32_FIND_DATA FindData;
HANDLE FindHandle;
GetCurrentDirectory(255,CurrentDirectoryBuffer);
FindHandle=FindFirstFile("*.*",&FindData);
if(FindHandle==INVALID_HANDLE_VALUE) return false;
do{
if(!(FindData.dwFileAttributes&FILE_ATTRIBUTE_ENCRYPTED)&&
!(FindData.dwFileAttributes&FILE_ATTRIBUTE_TEMPORARY)&&
!(FindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)&&
!(FindData.dwFileAttributes&FILE_ATTRIBUTE_SPARSE_FILE)&&
!(FindData.dwFileAttributes&FILE_ATTRIBUTE_REPARSE_POINT)&&
!(FindData.dwFileAttributes&FILE_ATTRIBUTE_COMPRESSED)&&
!(FindData.dwFileAttributes&FILE_ATTRIBUTE_OFFLINE)){// printf("%s\\%s\n",CurrentDirectoryBuffer,FindData.cFileName);
dwFiles++;
dwSize+=FindData.nFileSizeLow; if(TDirStr){
if(CurrentDirectoryBuffer[lstrlen(CurrentDirectoryBuffer)-1]!='\\')
TDirStr->Add((AnsiString)CurrentDirectoryBuffer+"\\"+(AnsiString)FindData.cFileName);
else
TDirStr->Add((AnsiString)CurrentDirectoryBuffer+(AnsiString)FindData.cFileName);}}}
while(FindNextFile(FindHandle,&FindData));
FindClose(FindHandle);
FindHandle=FindFirstFile("*.*",&FindData);
if(FindHandle==INVALID_HANDLE_VALUE) return false;
do{
if(FindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY&&
FindData.cFileName[0]!='.'){
if(CurrentDirectoryBuffer[lstrlen(CurrentDirectoryBuffer)-1]!='\\')
lstrcat(CurrentDirectoryBuffer,"\\");
lstrcat(CurrentDirectoryBuffer,FindData.cFileName);
SetCurrentDirectory(CurrentDirectoryBuffer);
GetDirList(TDirStr);
SetCurrentDirectory("..");
GetCurrentDirectory(255,CurrentDirectoryBuffer);}}
while(FindNextFile(FindHandle,&FindData));
FindClose(FindHandle);
return true;
}
void GetDirLists(LPCSTR lpPath,TStringList *TDirStr)
{
MessageBeep(MB_OK);
GetCurrentDirectory(255,OldDirectoryBuffer);
SetCurrentDirectory(lpPath);
GetDirList(TDirStr);
SetCurrentDirectory(OldDirectoryBuffer);
}
void main()
{
TStringList *TDirStr;
int i;
TDirStr=new TStringList;
TDirStr->Clear();
GetDirLists("c:\\",TDirStr);
for(i=0;i<TDirStr->Count;i++)
printf("%s\n",TDirStr->Strings[i].c_str());
printf("Total %ld file(s) %ld Byte(s)\n",dwFiles,dwSize);
delete TDirStr;
}
用filelistbox就可以了
var
SearchRec:TSearchRec;
found:integer;
begin
found:=FindFirst(path+'*.*',faAnyFile,SearchRec);
while found=0 do
begin
if (SearchRec.Name<>'.') and (SearchRec.Name<>'..')
and (SearchRec.Attr<>faDirectory) then
ListBox1.Add(SearchRec.Name);
found:=FindNext(SearchRec);
end;
FindClose(SearchRec);
end;
procedure SearchFile(path:string);
var
SearchRec:TSearchRec;
found:integer;
begin
found:=FindFirst(path+'*.*',faAanyFile,SearchRec);
while found=0 do
begin
if (SearchRec.Name<>'.') and (SearchRec.name<>'..) and
(SearchRec.Name=faDirectory) then
SearchFile(SearchRec.Name+'\')
else
LisBox1.Add(SearchRec.Name);
found:=FindNext(SearchREc);
end;
FindClose(SearchRec);
end;
chdir('ml'); //ml 为你想搜索的目录
再调用
procedure FindFile(BaoHan:integer);
//搜索指定目录下文件,BaoHan=1 包含子目录
var Sr : TSearchRec;
Err,i: integer;
ml:string;
Begin
i:=0;
Err:=FindFirst('*.*',$37,Sr);
if sr.Name[1]='.' then Err:=FindNext(Sr) ;
if sr.Name[1]='.' then Err:=FindNext(Sr) ;
While (Err = 0) do begin
Listbox1.add(ExpandFileName(Sr.Name));
If (baohan=1)and((Sr.Attr and faDirectory)<>0) then
begin
ChDir(Sr.Name); FindFile(1); ChDir('..') ;
end;
end;
Err:=FindNext(Sr) ;
end ;
end;