Рекурсивный поиск
|
|
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 |
Администратор
Сообщений: 906
Статус: Offline
|
Система: Windows 10 x64, Kali Linux Среды программирования: Delphi 7, Delphi 10.x
Я не профессионал, я всего лишь любитель Я не вредитель, я всего лишь теоретик
|
|
| |
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')
|
|
| |