Delphi - потоки и функция FindFirst

Я встречаюсь с большой проблемой, когда я пытаюсь сделать рекурсивную поисковую функцию в потоке (использующий Дельфи 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;

хорошо, вероятно, код немного испорчен, но я не понимаю, почему поток заканчивается в 'findfirst' части.... я погуглил его, никакие результаты.

любая справка будет цениться!

Заранее спасибо

1
задан The_Fox 18 June 2010 в 16:00
поделиться

1 ответ

В опубликованном вами коде я вижу, что вы пытаетесь поймать и забыть исключение. Если у вас есть неработающий код, содержащий что-то подобное, первое, что я делаю, это удаляю пустой блок except. Скорее всего, вы не знаете, что происходит, потому что вы выбрасываете нужную информацию.

В вашем коде есть два вызова FindFirst () . Подозрительно использование того каталога, в котором вы пытаетесь найти каталог. Я бы изменил ваш код на что-то вроде этого.

var
 SR : TSearchRec;

begin
  if FindFirst('C:\',faDirectory,SR) <> 0 then
     RaiseLastOSError;
end;

Тогда вы увидите причину FindFirst () Failed.

Вместо использования FindFirst () в случае, когда вы ищете каталог, я бы использовал вызов DirectoryExists () .

2
ответ дан 2 September 2019 в 23:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: