Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.03.2015, 17:26
Anton93 Anton93 вне форума
Прохожий
 
Регистрация: 20.02.2015
Сообщения: 27
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Поиск в подкатологах

помогите осуществить поиск по всем дискам и подкатологам,
пишу так

Код:
procedure FindFiles;
var
  WFD:WIN32_Find_Data;
  HFile:THandle;
  DType:Byte;
  Drive: Char;
  mask: PChar;
begin
  mask:='*.txt';
  for Drive:='a' to 'z' do
  DType:=GetDriveType(PChar(Drive+'\'));
    case DType of
      DRIVE_FIXED{HARD},DRIVE_REMOVABLE{USB}:
        begin
          HFile:=FindFirstFile(DType+mask,WFD);//Ищем файлы только в указанном каталоге
          if HFile<>INVALID_HANDLE_VALUE then //Проверяем отсутствие ошибок
          begin
            repeat
              if (WFD.dwFileAttributes and faDirectory)<>faDirectory then//Проверка что это не папка
              Form1.Memo1.Lines.Add(WFD.cFileName);
            until FindNextFile(HFile,WFD)<>True;
            Winapi.Windows.FindClose(HFile);
          end;
      end;
  end;
end;
именно WIN32_Find_Data без использования tsearchrec.
Ответить с цитированием
  #2  
Старый 02.03.2015, 05:53
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну у тебя же есть проверка того, что текущий элемент - не каталог. Соотвественно, в противном случае надо сделать рекурсивный вызов.
Того, тебе надо разбить твою процедуру на 2:
1. Стартовая. Назодит все диски и запускает поиск (2ю процедуру) для корня каждого диска.
2. Собственно, рекурсивная процедура поиска всего и вся от указанного (переданного в параметрах) пути.
Ответить с цитированием
  #3  
Старый 02.03.2015, 11:02
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Сразу скажу, загонять в мемо все файлы весьма не быстрое решение. Какая цель конечная?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 02.03.2015, 17:01
Anton93 Anton93 вне форума
Прохожий
 
Регистрация: 20.02.2015
Сообщения: 27
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Это тестовый код и надо же мне определять правильно ли он определяет файлы.
Ответить с цитированием
  #5  
Старый 05.03.2015, 21:40
Anton93 Anton93 вне форума
Прохожий
 
Регистрация: 20.02.2015
Сообщения: 27
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

почему не работает, исправил код вот так:

Код:
procedure LoadFile(path: String);
var
   FData: WIN32_Find_Data;
   HFile: THandle;
begin
  HFile:=FindFirstFile(PChar(path+'*.txt'),FData);//Ищем файлы только в указанном каталоге
  if HFile<>INVALID_HANDLE_VALUE then //Проверяем отсутствие ошибок
    begin
      repeat
        if (FData.dwFileAttributes and faDirectory)<>faDirectory then//Проверка что это не папка
          Form1.Memo1.Lines.Add(FData.cFileName)
          else
            LoadFile(path+FData.cFileName+'\');
      until FindNextFile(HFile,FData)<>True;
      Windows.FindClose(HFile);
    end;
end;

в Button помещаю вот это
Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
LoadFile('d:\');
end;
но выводит лишь файлы из первого католога, а именно все файлыd:\
Ответить с цитированием
  #6  
Старый 05.03.2015, 21:49
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Вы же сами отсекаете все каталоги таким фильтром:
Код:
HFile:=FindFirstFile(PChar(path+'*.txt'),FData)
Потому и не идет рекурсия, что нет ничего кроме текстовых файлов.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 05.03.2015, 22:27
Anton93 Anton93 вне форума
Прохожий
 
Регистрация: 20.02.2015
Сообщения: 27
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Вы же сами отсекаете все каталоги таким фильтром:
Код:
HFile:=FindFirstFile(PChar(path+'*.txt'),FData)
Потому и не идет рекурсия, что нет ничего кроме текстовых файлов.
не а как же мне тогда осуществить поиск по маске, он если заменить *.txt на *.*, он просто выводит все файлы.

Последний раз редактировалось Anton93, 05.03.2015 в 22:50.
Ответить с цитированием
  #8  
Старый 06.03.2015, 01:16
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А вот так:
Код:
HFile:=FindFirstFile(PChar(path+'\*.*'),FData);
...
if (FData.dwFileAttributes and faDirectory)<>0 
  then begin if (FData.cFileName <> '.') And (FData.cFileName <> '..') then LoadFile(path + FData.cFileName) end
  else
    if MatchesMask(FData.cFileName,'*.txt') Then
      begin
         // Делаем что-то полезное
      end
...
  
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:27.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter