function EnumFileInRecursion(path:PChar):Longint;stdcall;
var
searchRec:TSearchRec;
found:Integer;
tmpStr:String;
Extension,Fname:string;
begin
Result:=0; //查找结果(文件数)
//加上搜索后缀,得到类似 'c:\*.* ' 、 'c:\windows\*.* '的搜索路径
tmpStr:=StrPas(path)+ '\*.gif ';
//在当前目录查找第一个文件、子目录
found:=FindFirst(tmpStr,faAnyFile,searchRec);
while found=0 do
//找到了一个文件或目录后
begin
//如果找到的是个目录
if (searchRec.Attr and faDirectory) < >0 then
begin
{在搜索非根目录(C:\、D:\)下的子目录时会出现 '. ', '.. '的"虚拟目录"
大概是表示上层目录和下层目录吧要过滤掉才可以}
if (searchRec.Name < > '. ') and (searchRec.Name < > '.. ') then
begin
{由于查找到的子目录只有个目录名,所以要添上上层目录的路径
searchRec.Name = 'Windows ';tmpStr:= 'c:\Windows ';
加个断点就一清二楚了}
tmpStr:=StrPas(path)+ '\ '+searchRec.Name;
//自身调用,查找子目录,递归。
Result:=Result+EnumFileInRecursion(PChar(tmpStr));
end;
end
//如果找到的是个文件
{这个也是递归的结束条件,结束条件对于理解递归来说,相当重要}
else begin
{Result记录着搜索到的文件数。可是我是用CreateThread创建线程
来调用函数的,不知道怎么得到这个返回值我不想用全局变量}
Result:=Result+1;
//把找到的文件加到Memo控件
Extension:=UPPERCASE(ExtractFileExt(StrPas(path)+ '\ '+searchRec.Name));
Fname:= UPPERCASE(searchRec.Name);
filename:= StrPas(path)+ '\ '+searchRec.Name;
Form1.Memo1.Lines.Add(filename);
end;
//查找下一个文件或目录
found:=FindNext(searchRec);
end;
//释放资源
FindClose(searchRec);
end; procedure TForm1.FormCreate(Sender: TObject);
var
dwThreadID:Cardinal;
path:String;
i:integer;
s:string;
begin
if hThreadHandle1 = 0 then
begin
for i:=0 to 25 do
begin
s:=String(char(65+i))+ ': ';
if GetDriveType(pchar(s))=DRIVE_FIXED then
path:=(s);
end;
Memo1.Lines.Clear;
//得到驱动盘的路径,这样可能啰嗦了些.
//创建线程,使用递归方法遍历文件
hThreadHandle1:=CreateThread(nil,0,@EnumFileInRecursion,StrNew(PChar(path)),0,dwThreadID);
{@EnumFileInRecursion是函数的地址
PChar( 'c: ')是函数的参数,以指针传递
不能直接使用@EnumFileInRecursion( 'c: ')}
end else
begin
TerminateThread(hThreadHandle1,0);
CloseHandle(hThreadHandle1);
hThreadHandle1 := 0;
end;
end;
var
searchRec:TSearchRec;
found:Integer;
tmpStr:String;
Extension,Fname:string;
begin
Result:=0; //查找结果(文件数)
//加上搜索后缀,得到类似 'c:\*.* ' 、 'c:\windows\*.* '的搜索路径
tmpStr:=StrPas(path)+ '\*.gif ';
//在当前目录查找第一个文件、子目录
found:=FindFirst(tmpStr,faAnyFile,searchRec);
while found=0 do
//找到了一个文件或目录后
begin
//如果找到的是个目录
if (searchRec.Attr and faDirectory) < >0 then
begin
{在搜索非根目录(C:\、D:\)下的子目录时会出现 '. ', '.. '的"虚拟目录"
大概是表示上层目录和下层目录吧要过滤掉才可以}
if (searchRec.Name < > '. ') and (searchRec.Name < > '.. ') then
begin
{由于查找到的子目录只有个目录名,所以要添上上层目录的路径
searchRec.Name = 'Windows ';tmpStr:= 'c:\Windows ';
加个断点就一清二楚了}
tmpStr:=StrPas(path)+ '\ '+searchRec.Name;
//自身调用,查找子目录,递归。
Result:=Result+EnumFileInRecursion(PChar(tmpStr));
end;
end
//如果找到的是个文件
{这个也是递归的结束条件,结束条件对于理解递归来说,相当重要}
else begin
{Result记录着搜索到的文件数。可是我是用CreateThread创建线程
来调用函数的,不知道怎么得到这个返回值我不想用全局变量}
Result:=Result+1;
//把找到的文件加到Memo控件
Extension:=UPPERCASE(ExtractFileExt(StrPas(path)+ '\ '+searchRec.Name));
Fname:= UPPERCASE(searchRec.Name);
filename:= StrPas(path)+ '\ '+searchRec.Name;
Form1.Memo1.Lines.Add(filename);
end;
//查找下一个文件或目录
found:=FindNext(searchRec);
end;
//释放资源
FindClose(searchRec);
end; procedure TForm1.FormCreate(Sender: TObject);
var
dwThreadID:Cardinal;
path:String;
i:integer;
s:string;
begin
if hThreadHandle1 = 0 then
begin
for i:=0 to 25 do
begin
s:=String(char(65+i))+ ': ';
if GetDriveType(pchar(s))=DRIVE_FIXED then
path:=(s);
end;
Memo1.Lines.Clear;
//得到驱动盘的路径,这样可能啰嗦了些.
//创建线程,使用递归方法遍历文件
hThreadHandle1:=CreateThread(nil,0,@EnumFileInRecursion,StrNew(PChar(path)),0,dwThreadID);
{@EnumFileInRecursion是函数的地址
PChar( 'c: ')是函数的参数,以指针传递
不能直接使用@EnumFileInRecursion( 'c: ')}
end else
begin
TerminateThread(hThreadHandle1,0);
CloseHandle(hThreadHandle1);
hThreadHandle1 := 0;
end;
end;
解决方案 »
- 程序中能添加的窗体有没有限制,加了很多窗体会不会有什么问题?
- 简单问题!
- 在一表中怎样用sql语句删除重复的数据,只保留其中的一条数据?
- 请问,如何在一个table中创建永久字段?
- 如何从多字段的结果集中调用需要的字段的结果
- 用sqldmo做过sqlserver数据库的出版发布订阅吗?(急!!!在线等待)
- 询问一下componentcount的问题!!
- 请教一个问题,是关于TQuery的append方法的,哪位高手来帮忙解决一下?
- 谁知道哪有SPCOMM控件下载?
- 老鸭唐问:怎样在程序代码中使用Table组件的Filter属性?
- 求助,如何在程序中更新fastreport文件中的memo值
- 如何让report machine 2.6 支持繁体呢!
var
dwThreadID:Cardinal;
path:String;
i:integer;
s:string;
begin
if hThreadHandle1 = 0 then
begin
for i:=0 to 25 do
begin
s:=String(char(65+i))+ ': ';
if GetDriveType(pchar(s))=DRIVE_FIXED then
begin
path:=(s);
Break; //------------------------------------------关键
end;
end;
Memo1.Lines.Clear;
//得到驱动盘的路径,这样可能啰嗦了些.
//创建线程,使用递归方法遍历文件
hThreadHandle1:=CreateThread(nil,0,@EnumFileInRecursion,StrNew(PChar(path)),0,dwThreadID);
{@EnumFileInRecursion是函数的地址
PChar( 'c: ')是函数的参数,以指针传递
不能直接使用@EnumFileInRecursion( 'c: ')}
end else
begin
TerminateThread(hThreadHandle1,0);
CloseHandle(hThreadHandle1);
hThreadHandle1 := 0;
end;
end;
var
dwThreadID:Cardinal;
path:String;
i:integer;
s:string;
begin
if hThreadHandle1 = 0 then
begin
for i:=0 to 25 do
begin
s:=String(char(65+i))+ ': ';
if GetDriveType(pchar(s))=DRIVE_FIXED then
begin
path:=(s);
Break;
Memo1.Lines.Clear;
//得到驱动盘的路径,这样可能啰嗦了些.
//创建线程,使用递归方法遍历文件
hThreadHandle1:=CreateThread(nil,0,@EnumFileInRecursion,StrNew(PChar(path)),0,dwThreadID);
{@EnumFileInRecursion是函数的地址
PChar( 'c: ')是函数的参数,以指针传递
不能直接使用@EnumFileInRecursion( 'c: ')}
end;
end;
end else
begin
TerminateThread(hThreadHandle1,0);
CloseHandle(hThreadHandle1);
hThreadHandle1 := 0;
end;
end;