Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Поиск ехе


Автор: heskey 16.3.2005, 17:51
Привет! Подскажите как найти все ехе в заданном каталоге и его подкаталогах! Я сделал все функциями Findfirst,Findnext. Но проблема в том..что если изначально Findfirst не находит ехе в каком-либо каталоге..то ее значение<>0 и поэтому цикл поиска не начинается. Что можно сделать?

Автор: _hunter 16.3.2005, 18:06
найти тему типа "поиск файлов"
http://forum.vingrad.ru/index.php?showtopic=35104
http://forum.vingrad.ru/index.php?showtopic=13151
http://forum.vingrad.ru/index.php?showtopic=4617
и переделать под свои нужды

Автор: heskey 16.3.2005, 18:17
ДА ЭТО все ясно! Все уже читал..и у самого почти так же сделано! Но это все примеры только ля поиска всех файлов! Но стоит маску поменять на *.ехе как все накрывается..и все те примеры! Если в корневом каталоге *.ехе нет, то поиск прекращается!

Автор: Alex 16.3.2005, 18:33
вот процедура, которая все находит:
Код
procedure FindFilesByMask(List :tStrings; var DirCount :Integer; const DirName, Mask :String; SubDir: Boolean = True);
// Поиск файлов по маске в заданной папке и подпапке

  // Чем меньше параметров и локальных переменных у рекурсивной процедуры,
  // тем меньше она требует памяти под стек. Поэтому использую локальную
  // процедуру
  procedure ScanDirs(const DirName :String);
  var
    h   :tHandle;
    wfd :tWin32FindData;
  begin
    Inc(DirCount); // просто для статистики
    // Сначала просмотрим текущий каталог по заданной маске
    h := Windows.FindFirstFile(PChar(DirName+Mask), wfd);
    try
      if  h <> INVALID_HANDLE_VALUE  then begin
        repeat
          if  (wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0  then
            List.Add(DirName+wfd.cFileName);
        until  not Windows.FindNextFile(h,wfd);
      end;
      // проверка кода ошибки и FindFirstFile и FindNextFile
      case  GetLastError  of
        ERROR_NO_MORE_FILES,    // больше нет файлов и каталогов удовлетворяющих маске (но были)
        ERROR_FILE_NOT_FOUND,   // вообще нет файлов и каталогов удовлетворяющих маске
        ERROR_SHARING_VIOLATION // возникает во время создания каталога (уже создан но еще недоступен)
                              : ; // ничего не делаем, все Ok
        else // все остальные ошибки
          raise Exception.CreateFmt('Ошибка просмотра каталога "%s": %s',[DirName,SysErrorMessage(GetLastError)]);
      end;
    finally
      if  h <> INVALID_HANDLE_VALUE  then Windows.FindClose(h);
    end;

    // Теперь рекрсивно просмотрим подкаталоги
    if not SubDir then exit; // 13.06.03
    h := Windows.FindFirstFile(PChar(DirName+'*.*'), wfd);
    try
      if  h <> INVALID_HANDLE_VALUE  then begin
        repeat
          if   ((wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0)
           and (wfd.cFileName <> String('.'))
           and (wfd.cFileName <> '..')           then
            ScanDirs(IncludeTrailingPathDelimiter(DirName+wfd.cFileName));
        until  not Windows.FindNextFile(h,wfd);
      end;
      // проверка кода ошибки и FindFirstFile и FindNextFile
      case  GetLastError  of
        ERROR_NO_MORE_FILES,    // больше нет файлов и каталогов удовлетворяющих маске (но были)
        ERROR_FILE_NOT_FOUND,   // вообще нет файлов и каталогов удовлетворяющих маске
        ERROR_SHARING_VIOLATION // возникает во время создания каталога (уже создан но еще недоступен)
                              : ; // ничего не делаем, все Ok
        else // все остальные ошибки
          raise Exception.CreateFmt('Ошибка просмотра каталога "%s": %s',[DirName,SysErrorMessage(GetLastError)]);
      end;
    finally
      if  h <> INVALID_HANDLE_VALUE  then Windows.FindClose(h);
    end;
  end;

begin // FindFilesByMask
  ScanDirs(IncludeTrailingPathDelimiter(DirName));
end;

Добавлено @ 18:37
Пример использования:
Код

var
  n: Integer;
begin
  FindFilesByMask(ListBox1.Items, n, 'Путь', '*.exe');

Автор: heskey 16.3.2005, 18:49
спасибо большое! Великолепный код!
Очень выручил! smile

Автор: ~FoX~ 28.3.2005, 14:56
Код

procedure GetFile(Dir: string);
var
  f : TSearchRec;
  i : integer;
  s : string;
begin
  i := FindFirst(Dir+'*.exe', faAnyFile, f);
   while (i=0) do
    begin
      s:= dir + f.Name;
      Form1.ListBox1.Items.Add (S);
      i := FindNext(f);
      Application.ProcessMessages;
    end;
  FindClose(f);
end;

procedure GetDir(Dir: string);
var
  f : TSearchRec;
  i : integer;
  s : string;
begin
  i := FindFirst(Dir+'*.*', faDirectory, f);
  GetFile(Dir);
  while (i=0) do
    begin
    if (f.Name='.') or (f.Name='..') then
    else
      begin
      if (f.Attr and faDirectory)<>0 then
        begin
          GetDir(Dir+f.Name+'\');
          Application.ProcessMessages;
        end
      else
        begin
         i := FindNext(f);
        end;
      end;
      i := FindNext(f);
      Application.ProcessMessages;
    end;
  FindClose(f);
end;

А я вот так делал, и все нормально находиться.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)