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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2012, 13:12   #1
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию Поиск файлов в папке и ПОДПАПКАХ

Привет.
Есть процедура поиска файлов:
Код:
procedure TForm1.FindFile(Dir: String);
  var
    sr: TSearchRec;
  begin
    PutList.Clear;
    if FindFirst(Dir + '*.*', faAnyFile, sr) = 0 then
    begin

      repeat
        if (sr.Name <> '..') and (sr.Name <> '.') then
          if (sr.Attr and faDirectory) <> 0 then
            FindFile(Dir + sr.Name + '\')
          else
            putlist.Append(Dir + sr.Name);
      until FindNext(sr) <> 0;
      FindClose(sr);
    end;
end;
но если в папке есть подпака, то процедура ищет только в подпапке. Помогите, пожалуйста, допилить, что бы искала и в папке, и во всех подпапках.
trafbite вне форума Ответить с цитированием
Старый 02.09.2012, 19:32   #2
Сергей Горбач
 
Регистрация: 06.01.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от trafbite Посмотреть сообщение
Привет.
Есть процедура поиска файлов:
Код:
procedure TForm1.FindFile(Dir: String);
  var
    sr: TSearchRec;
  begin
    PutList.Clear;
    if FindFirst(Dir + '*.*', faAnyFile, sr) = 0 then
    begin

      repeat
        if (sr.Name <> '..') and (sr.Name <> '.') then
          if (sr.Attr and faDirectory) <> 0 then
            FindFile(Dir + sr.Name + '\')
          else
            putlist.Append(Dir + sr.Name);
      until FindNext(sr) <> 0;
      FindClose(sr);
    end;
end;
но если в папке есть подпака, то процедура ищет только в подпапке. Помогите, пожалуйста, допилить, что бы искала и в папке, и во всех подпапках.
Указанный Вами алгоритм построен так, что искать во всех подпапках не будет. Вам достаточно побольше прочитать в разной документации по поиску файлов. Почти везде приводятся примеры, как осуществить поиск файлов во всех подпапках.
Сергей Горбач вне форума Ответить с цитированием
Старый 02.09.2012, 20:07   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а я скажу что кучи раз выкладывался код по поиску:
http://programmersforum.ru/showpost....1&postcount=11
например тут.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.09.2012, 15:35   #4
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

Ребят, нифига я там не понял, можно пример?
Вот. например, нашел еще процедуру:
Код:
procedure FileFinder(Path: string;maska: string;recur: boolean ;sl: TStringList);
{
Path  - путь поиска
maska - маска поиска
recur - true  - искать и в подкаталогах
        false - искать только в указанной папке
sl    - список найденных файлов
}
var sr : TSearchRec;
begin
if (Path[Length(Path)]='\') then SetLength(Path,Length(Path)-1);
if FindFirst(Path+'\'+maska,faAnyFile,sr)=0
   then
      begin
         if (sr.Attr or faDirectory)=sr.Attr then
            begin
            if (recur=true) then
               begin
                  if (sr.name<>'.') and (sr.name<>'..') then
                  FileFinder(path+'\'+sr.Name,maska,recur,sl);
               end
            end
         else
         sl.Add(Path+'\'+sr.Name);
         while FindNext(sr) = 0 do
         if (sr.Attr or faDirectory)=sr.Attr then
            begin
            if (recur=true) then
               begin
                  if (sr.name<>'.') and (sr.name<>'..') then
                  FileFinder(path+'\'+sr.Name,maska,recur,sl);
               end
            end
         else
         sl.Add(Path+'\'+sr.Name);
      end;
   FindClose(sr);
end;
Но как ее вызывать?
Если делаю так:
Код:
FileFinder('D:\', '*.txt', true, List.Text)
то ругается
trafbite вне форума Ответить с цитированием
Старый 03.09.2012, 15:49   #5
avd
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 79
По умолчанию

Код:
// Функция удаляет из каталога dir (и всех подкаталогов) файлы
// с расширением ext которые созданы больше чем day дней назад.
procedure delFileOld(const dir: string; ext: string; day: word)
var
  f: TSearchRec;
  nameFile: string;
  dtfile: Tdate;
begin
  if findFirst(dir + '\*', faAnyFile, f) = 0 then
  repeat
    nameFile := f.Name;
    if (nameFile = '.') or (nameFile = '..') then continue;
    if f.Attr = faDirectory then delFileOld(dir + '\' + nameFile, ext, day);
    if (AnsiLowerCase(ExtractFileExt(nameFile)) = AnsiLowerCase('.' + ext)) then
    begin
      dtfile := FileDateToDateTime(f.Time);
      if Now - dtfile > day  then DeleteFile(PwideChar(dir + '\' + nameFile));
    end;
  until findNext(f) <> 0;
  findClose(f);
end;
avd вне форума Ответить с цитированием
Старый 03.09.2012, 19:54   #6
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

avd, отлично, спасибо!
trafbite вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Полные пути до файлов в указанной папке и подпапках. ZARO Общие вопросы Delphi 8 04.08.2010 19:17
Перечисление и работа с файлами в папке и подпапках Horus92 Общие вопросы Delphi 1 21.04.2010 16:59
Поиск в папке и подпапках(что то странное твориться) leo_new Общие вопросы Delphi 1 16.12.2009 20:01
Просмотр файлов в папке и подпапках Yar Помощь студентам 9 07.08.2007 16:56
Поиск файлов в папках и подпапках Format C: Общие вопросы Delphi 17 04.05.2007 23:31