Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2011, 01:27   #1
pupilMartyr
Пользователь
 
Аватар для pupilMartyr
 
Регистрация: 02.05.2011
Сообщений: 45
Вопрос Поиск файлов в каталоге

Здравствуйте. Задача такая. В выбранном каталоге программа производит поиск исполняемых файлов формата Win32PE (*.exe) и динамических библиотек (*.dll), с учетом подкаталогов.
Вот код:
Код:
procedure TForm1.FindFiles(dir: string);
  var SRexe, SRdll: TSearchRec;
      findResExe, findResDll:Integer;
      dir_copy: string;
begin
    dir_copy:= dir;

    findResExe:= FindFirst(dir + '*.exe', faAnyFile, SRexe);
    findResDll:= FindFirst(dir + '*.dll', faAnyFile, SRdll);

    while (findResExe = 0) do
    begin
        if ((SRexe.Attr and faDirectory) = faDirectory) then
        begin
            if not((SRexe.Name = '.') or (SRexe.Name = '..')) then
                FindFiles(dir + SRexe.Name + '\');
            findResExe:= FindNext(SRexe);
            Continue;
        end
        else begin
            sgFiles.RowCount:= sgFiles.RowCount + 1;
            sgFiles.Cells[0,sgFiles.RowCount - 1]:= SRexe.Name;
            sgFiles.Cells[1,sgFiles.RowCount - 1]:= IntToStr(SRexe.Size);

            findResExe:= FindNext(SRexe);
        end;
    end;

    while (findResDll = 0) do
    begin
        if ((SRdll.Attr and faDirectory) = faDirectory) then
        begin
            if not((SRdll.Name = '.') or (SRdll.Name = '..')) then
                FindFiles(dir_copy + SRdll.Name + '\');
            findResDll:= FindNext(SRdll);
        end
        else begin
            sgFiles.RowCount:= sgFiles.RowCount + 1;
            sgFiles.Cells[0,sgFiles.RowCount - 1]:= SRdll.Name;
            sgFiles.Cells[1,sgFiles.RowCount - 1]:= IntToStr(SRdll.Size);

            findResDll:= FindNext(SRdll);
        end;
    end;
    FindClose(SRexe);
    FindClose(SRdll);
end;
Конечно, повторение кода для dll, но это сейчас не так важно. Загвоздка в том, что файлы нужно находить и в подкаталогах, чего программа не делает. Хотя должна, т.к. я поверяю
Код:
  if ((SRexe.Attr and faDirectory) = faDirectory) then
Подскажите, пожалуйста, как решить эту проблему.
P.S. И заодно, может, проблему с повторением кода.

Последний раз редактировалось pupilMartyr; 04.12.2011 в 01:30.
pupilMartyr вне форума Ответить с цитированием
Старый 04.12.2011, 02:10   #2
pupilMartyr
Пользователь
 
Аватар для pupilMartyr
 
Регистрация: 02.05.2011
Сообщений: 45
По умолчанию

что никто не поможет?
Беда, беда (
pupilMartyr вне форума Ответить с цитированием
Старый 04.12.2011, 02:26   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Вы, фактически, пытаетесь найти каталоги с расширением .exe или .dll
Создайте такой, и оно в него непременно зайдёт )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 04.12.2011, 02:50   #4
pupilMartyr
Пользователь
 
Аватар для pupilMartyr
 
Регистрация: 02.05.2011
Сообщений: 45
По умолчанию

ооо, спасибо, что вы подсказали мне о том, какие файлы и с каким расширением я ищу!
Цитата:
Задача такая. В выбранном каталоге программа производит поиск исполняемых файлов формата Win32PE (*.exe) и динамических библиотек (*.dll), с учетом подкаталогов.
Для тестирования своей программы я создаю несколько папок с exe и dll. Благо у мну их предостаточно. Программа их находит, но если в папке сделать подкаталог, то уже нет.
По логике, она должна работать правильно, поэтому и сложно исправить.
pupilMartyr вне форума Ответить с цитированием
Старый 04.12.2011, 03:01   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Вы не поняли. Создайте папку (а не файл) с расширением .exe или .dll, и ваш код зайдёт в неё рекурсивно, как вы того и хотели.

Как это исправить, другой вопрос.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 04.12.2011, 15:10   #6
pupilMartyr
Пользователь
 
Аватар для pupilMartyr
 
Регистрация: 02.05.2011
Сообщений: 45
По умолчанию

Да нет. Вроде все нормально.
Может это я чего-то не понимаю? Почему он должен обращаться к папке с расширением exe?
Если я встречаю папку, то к пути dir я добавляю имя этой папки, затем \, затем расширение файла.
Вот еще одна версия, но тоже безнадежно.
Код:
procedure TForm1.FindFilesExe(dir: string);
  var SRexe: TSearchRec;
      findResExe: integer;
begin
    findResExe:= FindFirst(dir + '*.exe', faAnyFile, SRexe);

    while (findResExe = 0) do
    begin
        if ((SRexe.Attr and faDirectory) = faDirectory) then
        begin
            if (SRexe.Name <> '.') and (SRexe.Name <> '..') then
                FindFilesExe(dir + SRexe.Name + '\');
            findResExe:= FindNext(SRexe);
        end
        else begin
            sgFiles.RowCount:= sgFiles.RowCount + 1;
            sgFiles.Cells[0,sgFiles.RowCount - 1]:= SRexe.Name;
            sgFiles.Cells[1,sgFiles.RowCount - 1]:= IntToStr(SRexe.Size);

            findResExe:= FindNext(SRexe);
        end;
    end;
    FindClose(SRexe);
end;
В интернете, на форумах, предлагают различные решения поиска файлов в каталогах и подкаталогах. Люди пишут, что работает. Я копирую этот код себе, но он у меня не работает.
Наверняка, я что-то не так делаю. Объясните, пожалуйста.

Последний раз редактировалось pupilMartyr; 04.12.2011 в 15:58.
pupilMartyr вне форума Ответить с цитированием
Старый 04.12.2011, 15:50   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Один цикл по обработке всех имен в каталоге без указания расширения.
В нем выбирайте файлы с нужным расширением.
При встрече подкаталога рекурсивно обращайтесь к этой же процедуре.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.12.2011, 16:05   #8
pupilMartyr
Пользователь
 
Аватар для pupilMartyr
 
Регистрация: 02.05.2011
Сообщений: 45
По умолчанию

Я так понимаю, вы предлагаете:
Код:
procedure TForm1.FindFilesExe(dir: string);
  var SRexe: TSearchRec;
      findResExe: integer;
begin
findResExe:= FindFirst(dir + '*.*', faAnyFile, SRexe);

    while (findResExe = 0) do
    begin
        if ((SRexe.Attr and faDirectory) = faDirectory) then
        begin
            if (SRexe.Name <> '.') and (SRexe.Name <> '..') then
                FindFilesExe(dir + SRexe.Name + '\');
            findResExe:= FindNext(SRexe);
        end
        else begin
        А ЗДЕСЬ ПРОВЕРЯТЬ, НУЖНОЕ РАСШИРЕНИЕ?
            sgFiles.RowCount:= sgFiles.RowCount + 1;
            sgFiles.Cells[0,sgFiles.RowCount - 1]:= SRexe.Name;
            sgFiles.Cells[1,sgFiles.RowCount - 1]:= IntToStr(SRexe.Size);

            findResExe:= FindNext(SRexe);
        end;
    end;
    FindClose(SRexe);
end;
Так?
pupilMartyr вне форума Ответить с цитированием
Старый 04.12.2011, 16:06   #9
pupilMartyr
Пользователь
 
Аватар для pupilMartyr
 
Регистрация: 02.05.2011
Сообщений: 45
По умолчанию

И как тогда проверять то ли расширение?

Последний раз редактировалось pupilMartyr; 04.12.2011 в 16:15.
pupilMartyr вне форума Ответить с цитированием
Старый 04.12.2011, 16:39   #10
hiho
Форумчанин
 
Регистрация: 29.04.2008
Сообщений: 100
По умолчанию

http://www.programmersforum.ru/showthread.php?t=128762
hiho вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как загрузить в Мemo список файлов в каталоге g00dhash Общие вопросы Delphi 7 23.01.2015 10:32
Java чтение списка файлов в каталоге Lucky777 Помощь студентам 1 20.10.2011 21:00
Delphi. Выполнить поиск файлов в заданной пользователем каталоге Татьянушка Помощь студентам 0 23.05.2011 03:14
Переименование всех файлов в каталоге calugin PHP 3 14.05.2011 12:05
поиск в каталоге (assembler) YaraF Помощь студентам 0 28.02.2011 17:15