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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2015, 10:22   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос FindFirst не ищет файлы если в папке есть только папки с файлами.

Всем добра.

Нужно:
Рекурсивный обход папок и построение списка файлов.

Проблема:
каталог содержит папки, а те содержат файлы:
D:\123\
--+\1\
--+\2\
--+\3\
--+\ещё 10050 папок с файлами.
-- а тут файлов нет.

Код:
Код:
procedure ScanDir(StartDir, Mask: string; List: TStrings);
var
  SearchRec: TSearchRec;
  code: integer;
begin
  if Mask = '' then Mask := '*.*';
  if StartDir[Length(StartDir)] <> '' then StartDir := StartDir + '';
  code := FindFirst(StartDir + Mask, faAnyFile and faDirectory, SearchRec);
  if code <> 0 then
    ShowMessage(SysErrorMessage(code));
  if code = 0 then
  begin
    try
      repeat
        Application.ProcessMessages;
        if (SearchRec.Attr and faDirectory) <> faDirectory then
          List.Add(StartDir + SearchRec.Name)
        else if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
          ScanDir(StartDir + SearchRec.Name + '', Mask, List);
      until FindNext(SearchRec) <> 0;
    finally
      FindClose(SearchRec);
    end;
  end;
end;
code = 2, т.е. не найден указанный файл или путь.

IDE: Delphi 7

Последний раз редактировалось Человек_Борща; 22.04.2015 в 10:26.
Человек_Борща вне форума Ответить с цитированием
Старый 22.04.2015, 10:32   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Проблему решил.
Нужно сначала обходить папку с конкретной маской файла, если пусто, то искать все файлы, тогда начнет находить папки, и заходить в них.
Человек_Борща вне форума Ответить с цитированием
Старый 22.04.2015, 11:00   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не оч. понял что у тебя происходит, но сам уже сколько лет пользуюсь таким: http://www.programmersforum.ru/showthread.php?t=6639
Ни разу не подводило.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.04.2015, 11:06   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Нужно сначала обходить папку с конкретной маской файла, если пусто, то искать все файлы, тогда начнет находить папки, и заходить в них.
Можно и одним циклом
Код:
procedure ScanDir(StartDir, Mask: string; List: TStrings);
var
  SearchRec: TSearchRec;
  code: integer;
begin
  if Mask = '' then Mask := '*.*';
//  if StartDir[Length(StartDir)] <> '' then StartDir := StartDir + '';
  if StartDir[Length(StartDir)] <> '\' then StartDir := StartDir + '\';
//  code := FindFirst(StartDir + Mask, faAnyFile and faDirectory, SearchRec);
  code := FindFirst(StartDir + '*.*', faAnyFile and faDirectory, SearchRec);
  if code <> 0 then
    ShowMessage(SysErrorMessage(code));
  if code = 0 then
  begin
    try
      repeat
        Application.ProcessMessages;
//        if (SearchRec.Attr and faDirectory) <> faDirectory then
        if ((SearchRec.Attr and faDirectory) <> faDirectory) and MatchesMask(SearchRec.Name,Mask) then
          List.Add(StartDir + SearchRec.Name)
//        else if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
        else if ((SearchRec.Attr and faDirectory)=faDirectory) and (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
//          ScanDir(StartDir + SearchRec.Name + '', Mask, List);
          ScanDir(StartDir + SearchRec.Name , Mask, List);
      until FindNext(SearchRec) <> 0;
    finally
      FindClose(SearchRec);
    end;
  end;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.04.2015, 11:51   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Код:
FindFirst(StartDir + '*.*', faAnyFile and faDirectory, SearchRec);
Забавное у вас значение параметра Attr
northener на форуме Ответить с цитированием
Старый 22.04.2015, 12:01   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

То, что бы масло масляней было
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.04.2015, 12:05   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
То, что бы масло масляней было
Ну уж если переходить на аналогии, то это скорее попытка выдать дешевый маргарин (faDirectory) за дорогое сливочное масло.
northener на форуме Ответить с цитированием
Старый 22.04.2015, 12:18   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вообще-то да, не обратил внимания. От faAnyFile and faDirectory должно остаться только faDirectory. А чего вообще работает? Запустил у себя по маске *.exe в сильно древовидном каталоге нашло как ни в чем не бывало. Поменял на faAnyFile - тот же результат

ADD врубился, там обычные файлы, поэтому и сработало

Цитата:
The Attr parameter specifies the special files to include in addition to all normal files. Choose from these file attribute constants when specifying the Attr parameter:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 22.04.2015 в 12:22.
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как найти файл в папке, если в имени папки есть точка? Zis67 Общие вопросы Delphi 9 03.10.2012 20:32
Поиск файлов, ищет только если выбрать диск HellMercenariess Общие вопросы Delphi 6 26.09.2012 21:47
Процедура поиска НЕ ищет файлы вне "своей" папки Человек_Борща Общие вопросы Delphi 10 07.06.2010 15:02
Как скомпилировать прогу, если у меня есть только *.cpp файл? TwiX Общие вопросы C/C++ 4 13.11.2009 21:13
как определить какие файлы есть в папке и вывести их имена в текстовый файл Tdoctor Паскаль, Turbo Pascal, PascalABC.NET 3 04.11.2008 05:18