Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск ехе, Поиск ехе в директориях 
:(
    Опции темы
heskey
Дата 16.3.2005, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 3.12.2004

Репутация: нет
Всего: нет



Привет! Подскажите как найти все ехе в заданном каталоге и его подкаталогах! Я сделал все функциями Findfirst,Findnext. Но проблема в том..что если изначально Findfirst не находит ехе в каком-либо каталоге..то ее значение<>0 и поэтому цикл поиска не начинается. Что можно сделать?
PM MAIL   Вверх
_hunter
Дата 16.3.2005, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
heskey
Дата 16.3.2005, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 3.12.2004

Репутация: нет
Всего: нет



ДА ЭТО все ясно! Все уже читал..и у самого почти так же сделано! Но это все примеры только ля поиска всех файлов! Но стоит маску поменять на *.ехе как все накрывается..и все те примеры! Если в корневом каталоге *.ехе нет, то поиск прекращается!
PM MAIL   Вверх
Alex
Дата 16.3.2005, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 6
Всего: 162



вот процедура, которая все находит:
Код
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');



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
heskey
Дата 16.3.2005, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 3.12.2004

Репутация: нет
Всего: нет



спасибо большое! Великолепный код!
Очень выручил! smile
PM MAIL   Вверх
~FoX~
Дата 28.3.2005, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 0
Всего: 68



Код

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;

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


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1079 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.