Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi-线程和FindFirst函数_Delphi_Search_File_Multithreading - Fatal编程技术网

Delphi-线程和FindFirst函数

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

当我试图在线程内创建递归搜索函数(使用delphi 7)时,遇到了一个大问题。下面是代码:

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分钟让它看起来很好。尽可能消除阻碍他人帮助你的障碍。丑陋的代码是分散注意力的障碍。不相关的细节也是如此。一个可能不相关的细节是,这是在一个单独的线程中。你不必怀疑它是否与线程相关。在主线程中测试它并找出答案。更好的是,在一个新程序中运行它,该程序只运行此代码。当你说“不起作用”时,你必须更具体一些。不要让人们猜测;这是另一个障碍。