Форум: "Система";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
ВнизПроцедура списка файлов в каталоге Найти похожие ветки
← →
MsGuns (2002-09-24 23:40) [0]Торможу аж стыдно, но ЗАБЫЛ!!!!
Пересмотрел весь хелп по ф-циям и не нашел !
Но ведь есть же простая ф-я выдачи списка всех файлов в указанном каталоге (даже с фильтром), но вылетело :(
Подскажите будьте добры ! Заранее благодарен !
← →
RV (2002-09-25 02:19) [1]findfirst
findnext
вот так примерно работает
var
path,ss:string;
SerRec:tSearchRec;
begin
memo2.Lines.Clear;
path:="D:\Program Files\WinGate\cache\";
if (findfirst(path+"*.*",faAnyFile,SerRec)=0) then begin
memo2.Lines.Add(SerRec.name);
findnext(SerRec);
while findnext(SerRec)=0 do
if ItHTML(path+SerRec.name) then memo2.Lines.Add(SerRec.name);
end;
end;
← →
MBo (2002-09-25 06:56) [2]Если надо кратко, можно ListBox послать message LB_DIR и при необходимости скопировать полученные Items куда нужно
← →
Харальд (2002-09-25 10:21) [3]2 RV. Каждый FindFirst нужно закрывать своим FindClose. И перед циклом FindNext не нужен. А так все правильно.
← →
Anatoly Podgoretsky (2002-09-25 10:28) [4]Харальд (25.09.02 10:21)
Не для каждого, а для тех вызов которых закончился успешно, не соблюдения этого правила привет к ошибке в некоторых версиях Дельфи, тоже касается WinAPI
← →
Zemal (2002-09-25 12:14) [5]Anatoly Podgoretsky >>
FindClose закроит поиск даже если он и неначат успешно. Помоему в стандартном примере в Делфе, открытие поиска стоит в разделе "try", а закрытие в разделе "finaly"... так что при закрытии неоткрытого поиска ничего не произойдёт, наверное :)... Насколько я знаю TSearchRec это просто запись, а не класс потомок TObject... и следовательно не требуется его создавать, а потом уничтожать... вот-с... Так что уважаемый Anatoly Podgoretsky вы неправы, хотя я и не проверял, но я так предчувствую, что FindClose просто очищает поля записи TSearchRec (ну, типа, сбрасывает счётчик)... может я и не прав :)... что-то влом смотреть как там всё... :)
← →
Сергей Медяник (2002-09-25 18:56) [6]Процедура рекурсивного поиска/выборки/обработки файлов по условиям в каталоге и подкаталогах:
DemoFilesList :TStringList
(визуальный компонент, который Visible=False – лень было отслеживать создание и удаление в RunTime)
procedure ProcessFiles;
//процедура собственно поиска. так как вызывается рекурсивно, то в ней нельзя производить никакой подготовки к сканированию (типа очистки списка и пр.
//каталог передается с "\" в конце!!!
procedure RecurseScan(DirName :String);
var
F: TSearchRec;
begin
//для рекурсивного поиска маску здесь менять нельзя
if FindFirst(DirName+"*.*", faAnyFile, F)=0 then
begin
repeat
//если найден каталог и не верхний, сканировать его
if (F.Attr=faDirectory) and (F.Name[1]<>".") then RecurseScan(DirName+F.Name+"\");
//исключаем из имен имена папок и метки дисков
if not ((F.Attr and faDirectory<>0) or (F.Attr and faVolumeID<>0)) then
begin
//проверять маску надо здесь
if MatchesMask(UpperCase(F.Name), "PIC*.JPG") then
begin
//теперь DirName+F.Name – полнейшее имя файла,
//что хочешь, то и делай
// я составлял список JPG картинок для слайд-шоу
DemoFilesList.Items.Append(DirName+F.Name);
//это можно не писать, но тогда прога повиснет на процесс сканирования - по вкусу
Application.ProcessMessages;
end;
end;
until FindNext(F)<>0;
FindClose(F);
end;
end;
begin
//очистка списка файлов
DemoFilesList.Items.Clear;
//передается начальный каталог. В частности у меня: X:\ПУТЬ_ПРОГРАММЫ...\DATA\
RecurseScan(ExtractFilePath(ParamStr(0))+"DATA\");
end;
Здесь все последовательности открытия и закрытия поиска содрал непосредственно из примера в Helpе. У меня алгоритм работает весьма быстро и без глюков на огромном количестве файлов (10-15 вложений, сотни файлов).
← →
Ocean (2002-09-26 12:31) [7]Спасибо за отлично откомментированный пример, в наше время это редкость. И все же я не могу себе до конца представить программную реализацию рекурсивного алгоритма обхода дерева. Все время кажется, что где-то скрыто какое-то противоречие. Возможно, тут не надо долго рассуждать, глаза боятся, а руки делают.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c