Вторник, 19.09.2017, 18:24 Приветствую вас Гость | Группа "Гости" 


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: xXxSh@dowxXx, Anton93, Волк-1024 
delfcode » Delphi » Вопросы по Delphi » Рекурсивный поиск
Рекурсивный поиск
HTTqpДата: Понедельник, 02.03.2015, 00:49 | Сообщение # 1
Частый гость
Зарегистрирован: 08.10.2014
Группа: Пользователи
Сообщений: 57
Статус: Offline
помогите добавить поиск в подкатологах, написал код по всем дискам, но он ищет только в первой папке вот мой код:
Код


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

Только пожалуйста есть будут примеры нужно как можно меньше переменных. И обойтись WIN32_Find_Data.
И еще как сделать поиск несколько расширейний, я так понял в виде массива, но не знаю как правильно реализовать


Сообщение отредактировал HTTqp - Понедельник, 02.03.2015, 00:51
 
d4rkzyДата: Понедельник, 02.03.2015, 08:47 | Сообщение # 2
Постоянный
Зарегистрирован: 15.11.2013
Группа: Пользователи
Сообщений: 135
Статус: Offline
Цитата HTTqp ()
И обойтись WIN32_Find_Data.

Зажми ALT и тыкни по переменной WIN32_FIND_DATA - тебе нужно урвать этот класс в себе в юнит.
 
HTTqpДата: Понедельник, 02.03.2015, 09:13 | Сообщение # 3
Частый гость
Зарегистрирован: 08.10.2014
Группа: Пользователи
Сообщений: 57
Статус: Offline
Цитата d4rkzy ()
Зажми ALT и тыкни по переменной WIN32_FIND_DATA - тебе нужно урвать этот класс в себе в юнит.

не понял к чему это? этот клас есть в unit wundows. По моему ты что то не то сказал)
 
dolphinДата: Понедельник, 02.03.2015, 12:17 | Сообщение # 4
Администратор
Сообщений: 902
Статус: Offline


Система: Windows 10 x64, Windows XP
Среды программирования: Delphi 7, Delphi 10 Seattle

Я не профессионал, я всего лишь любитель
Я не вредитель, я всего лишь теоретик
 
ramzeswrДата: Понедельник, 02.03.2015, 12:26 | Сообщение # 5
Участник
Зарегистрирован: 17.04.2013
Группа: Пользователи
Сообщений: 61
Статус: Offline
Вот набросал пример
Код
program Project2;

uses
      windows;

function GetExtension(s: string): string;
var
      i: integer;
begin
      result:='';
      for i:=Length(s) downto 0 do
        if s[i] = '.' then
          begin
            result:=copy(s, i, Length(s));
            exit;
          end;
end;

function FindFile(path, ext: string): boolean;
var
      a: Cardinal;
      fa: _WIN32_FIND_DATAA;
begin
     a:=FindFirstFile(PansiChar(path+PChar('\*.*')),fa);
     SetConsoleTitle(PChar(path));
      while FindNextFile(a,fa) do
       begin
       if ((fa.cFileName<> '..') and  (fa.cFileName<> PChar('.'))) then
          begin
            if fa.dwFileAttributes = $00000010 then FindFile(path+'\'+fa.cFileName, ext)
              else if pos(CharLower(PansiChar(GetExtension(fa.cFileName)+#0)), CharLower(PansiChar(ext+#0)))<>0
                then writeln(path+'\'+fa.cFileName);
          end;
       end;
      FindClose(a);
end;

var
      C: char;
begin
      AllocConsole();
      SetConsoleCP(1251);
      SetConsoleOutputCP(1251);

      for C:= 'A' to 'Z' do
        FindFile(C+':', '.res.txt');
      readln;
end.


Рекурсивно ищет по всем дискам файлы с расширениями .res и .txt


Сообщение отредактировал ramzeswr - Понедельник, 02.03.2015, 12:44
 
ramzeswrДата: Пятница, 06.03.2015, 12:11 | Сообщение # 6
Участник
Зарегистрирован: 17.04.2013
Группа: Пользователи
Сообщений: 61
Статус: Offline
Код

procedure LoadFile(path: String);
  var
     FData: WIN32_Find_Data;
     HFile: THandle;
  begin
    HFile:=FindFirstFile(PChar(path+'\'+'*.*'),FData);
    if HFile<>INVALID_HANDLE_VALUE then
      begin
        while FindNextFile(HFile,FDATA) do
        begin
        if ((FDATA.cFileName<> '..') and  (FDATA.cFileName<> PChar('.'))) then
           begin
             if FDATA.dwFileAttributes = $00000010 then LoadFile(path+'\'+FDATA.cFileName)
               else  if ExtractFileExt(FData.cFileName)='.txt'
                 then form1.memo1.lines.add(path+'\'+FData.cFileName);
           end;
        end;
        Windows.FindClose(HFile);
      end;
  end;


Код
LoadFile('c:\users\admin\desktop')
 
delfcode » Delphi » Вопросы по Delphi » Рекурсивный поиск
Страница 1 из 11
Поиск:

delfcode.ru © 2008 - 2017 Хостинг от uCoz