Delphi-线程和FindFirst函数
当我试图在线程内创建递归搜索函数(使用delphi 7)时,遇到了一个大问题。下面是代码:Delphi-线程和FindFirst函数,delphi,search,file,multithreading,Delphi,Search,File,Multithreading,当我试图在线程内创建递归搜索函数(使用delphi 7)时,遇到了一个大问题。下面是代码: TParcFicDir = class(TThread) private several variables.. protected procedure Execute; override; public constructor Create(CreateSuspended: Boolean); constructor TParcFicDir.Create(CreateSusp
TParcFicDir = class(TThread)
private
several variables..
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: Boolean);
constructor TParcFicDir.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
end;
procedure TParcFicDir.Execute;
begin
try
FindFiles(FStartDir,FMask);//'c:\' and '*.*'
except on e:Exception do
end;
end;
procedure TParcFicDir.FindFiles(StartDir, FileMask: string);
var
wTmp : string;
f:TextFile;
wTempSR:TSearchRec;
function Search(StartDir, FileMask: string): string;
var
SR : TSearchRec;
IsFound : Boolean;
files : integer;
dirs : integer;
t : string;
begin
try
files := 0;
dirs := 0;
if StartDir[length(StartDir)] <> '\' then
StartDir := StartDir + '\';
try
IsFound := (FindFirst(StartDir + '*.*', faAnyFile, SR) = 0);// here the thread gets interrupted
except on e: Exception do
end;
while IsFound do
begin
if (SR.Name <> '.') and (SR.Name <> '..') then
if ((SR.Attr and faDirectory) <> 0) then
if FScanDirs then
begin
inc(dirs);
t := Search(StartDir + SR.Name, FileMask);
try
files := files + strtoint(copy((t), 0, pos('#', t) - 1));//old code, don't take on calcul;
Delete(t, 1, pos('#', t));
dirs := dirs + strtoint(t);
except on e: Exception do
end;
begin
t := StartDir + SR.Name;
wTmp := t;
wtmp := '';
Inc(FDirNo);
writeln(f,t);
inc(filno);
end;
end
else
if ScanFiles then
begin
inc(filno);
inc(files);
end;
IsFound := FindNext(SR) = 0;
end;
Result := IntToStr(files) + '#' + IntToStr(dirs);
sysutils.FindClose(SR);
except on e: Exception do
end;
end;
begin
filno := 0;
try
try
if trim(FPathFileTmp)<>'' then
AssignFile(f, FPathFileTmp+'Temp.bak')
else
AssignFile(f,ExtractFileDir(GetDllName)+'\Temp.bak');
Rewrite(f);
Search(StartDir, FileMask);
if StartDir[length(StartDir)] = '\' then
delete(StartDir, length(StartDir), 1);
wTmp := StartDir;
wTmp := '';
if FindFirst(StartDir, faDirectory, wTempSR) = 0 then
writeln(f);
writeln(f);
CloseFile(f);
except on e: Exception do
end;
finally
end;
end;
TParcFicDir=class(TThread)
私有的
几个变量。。
受保护的
程序执行;推翻
公众的
构造函数创建(CreateSuspended:Boolean);
构造函数TParcFicDir.Create(CreateSuspended:Boolean);
开始
继承的创建(CreateSuspended);
结束;
程序TParcFicDir.Execute;
开始
尝试
FindFile(FStartDir,FMask);/'c:\'和'*.''
e上除外:例外
结束;
结束;
过程TParcFicDir.findFile(StartDir,文件掩码:字符串);
变量
wTmp:字符串;
f:文本文件;
wTempSR:TSearchRec;
函数搜索(StartDir,文件掩码:string):string;
变量
SR:TSearchRec;
IsFound:布尔型;
文件:整数;
dirs:整数;
t:弦;
开始
尝试
档案:=0;
dirs:=0;
如果StartDir[长度(StartDir)]“\”则
StartDir:=StartDir+'\';
尝试
IsFound:=(FindFirst(StartDir+'*.*',faAnyFile,SR)=0);//这里线程被中断
e上除外:例外
结束;
当我发现你在做什么的时候
开始
如果(SR.Name'')和(SR.Name'..'),则
如果((SR.Attr和faDirectory)0),则
如果你是坎迪斯的话
开始
公司(dirs),;
t:=搜索(起始文件+高级名称、文件掩码);
尝试
文件:=files+stroint(复制((t),0,pos('#',t)-1)//旧代码,不要接受计算;
删除(t,1,pos(“#”,t));
dirs:=dirs+stroint(t);
e上除外:例外
结束;
开始
t:=StartDir+SR.名称;
wTmp:=t;
wtmp:='';
公司(FDirNo),;
写(f,t);
公司(filno),;
结束;
结束
其他的
如果扫描文件,那么
开始
公司(filno),;
公司(档案);
结束;
IsFound:=FindNext(SR)=0;
结束;
结果:=IntToStr(文件)+'#'+IntToStr(目录);
sysutils.FindClose(SR);
e上除外:例外
结束;
结束;
开始
filno:=0;
尝试
尝试
如果修剪(FPathFileTmp)“,则
AssignFile(f,FPathFileTmp+'Temp.bak')
其他的
AssignFile(f,ExtractFileDir(GetDllName)+'\Temp.bak');
重写(f);
搜索(StartDir、文件掩码);
如果StartDir[长度(StartDir)]='\'则
删除(StartDir,长度(StartDir),1);
wTmp:=StartDir;
wTmp:='';
如果FindFirst(StartDir、FadDirectory、wTempSR)=0,则
书面(f);
书面(f);
关闭文件(f);
e上除外:例外
结束;
最后
结束;
结束;
好的,可能代码有点混乱,但我不明白为什么线程以“findfirst”部分结束……我用谷歌搜索了一下,没有结果
任何帮助都将不胜感激
提前感谢在您发布的代码中,我看到您例外。当您破坏了包含类似内容的代码时,我要做的第一件事就是删除空的except块。很可能你不知道发生了什么,因为你把你需要的信息扔掉了 在代码中有两个对
FindFirst()
的调用。您尝试查找目录时使用的目录是可疑的。我会把你的代码改成这样
var
SR : TSearchRec;
begin
if FindFirst('C:\',faDirectory,SR) <> 0 then
RaiseLastOSError;
end;
var
SR:TSearchRec;
开始
如果FindFirst('C:\',faDirectory,SR)0,则
赖斯·塞罗;
结束;
然后您将看到失败的原因
在查找目录时,我将使用
DirectoryExists()
调用,而不是使用FindFirst()
。在异常处理程序中添加ShowMessage(E.Message),当引发异常时,至少您有一些关于它的信息。是的<代码>尝试..例外情况除外do end代码>是一个非常糟糕的主意。线程是否真的与这个问题相关?如果你在一个程序中独自运行这段代码呢?你说代码是乱七八糟的,所以先担心这个问题,然后再担心让它在一个单独的线程中工作。我猜你忘了告诉我们这是怎么回事了?抱歉,但是我们不介意编译并试图找出问题所在。如果代码因为看起来不好而“混乱”,那么花2分钟让它看起来很好。尽可能消除阻碍他人帮助你的障碍。丑陋的代码是分散注意力的障碍。不相关的细节也是如此。一个可能不相关的细节是,这是在一个单独的线程中。你不必怀疑它是否与线程相关。在主线程中测试它并找出答案。更好的是,在一个新程序中运行它,该程序只运行此代码。当你说“不起作用”时,你必须更具体一些。不要让人们猜测;这是另一个障碍。