Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизПолучить массив содержащий все поддирректории данной директории Найти похожие ветки
← →
leonidus (2005-01-03 11:47) [0]Мастера подскажите советом. Есть директория с множеством вложенных папок, нужно задав начальный путь к даной директории просканировать ее и заполнить массив путями ко всем вложенным директориям. использую сделующий код:
Function GetDir_(sDir : String):boolean;
var
iIndex : Integer;
SearchRec : TSearchRec;
sFileName : String;
begin
Result := False;
iIndex := FindFirst(sDir + "\*.*", FaDirectory, SearchRec);
while iIndex = 0 do
Begin
if SearchRec.Attr = faDirectory then
begin
if (SearchRec.Name <> "" ) and (SearchRec.Name <> ".") and (SearchRec.Name <> "..") then
begin
inc(kol_dir);
dir[kol_dir]:={sDir + "\" + }SearchRec.Name;
GetDir(sDir + "\" + SearchRec.Name);
end;
end;
iIndex := FindNext(SearchRec);
End;
FindClose(SearchRec);
end;
Он работает но сканирует не полностью. Подскажите пожалуйста где грабли.
← →
Sandman25 © (2005-01-03 11:49) [1]if SearchRec.Attr and faDirectory > 0 then
← →
begin...end © (2005-01-03 11:50) [2]> leonidus (03.01.05 11:47)
Для начала, замените if SearchRec.Attr = faDirectory then на if (SearchRec.Attr and faDirectory) > 0 then. Сообщите о результатах.
← →
leonidus (2005-01-03 11:51) [3]Все равно не все сканируется
← →
leonidus (2005-01-03 11:53) [4]сканирование идет в глубь по одной из дирректорий, не замечай другие направления
← →
Sandman25 © (2005-01-03 11:53) [5]Тогда попробуйте
iIndex := FindFirst(sDir + "\*.*", FaAnyFile, SearchRec);
← →
Sandman25 © (2005-01-03 11:54) [6][4] leonidus (03.01.05 11:53)
Это называется обход в глубину. Потом вернется на предыдущий уровень.
Если нужен обход в ширину, придется сначала записывать все каталоги, а только потом вызывать их обход.
← →
leonidus (2005-01-03 11:56) [7]>Sandman25 а можно примерчик
← →
begin...end © (2005-01-03 11:57) [8]> [7] leonidus (03.01.05 11:56)
Просто исправьте свой код с учётом [5].
← →
leonidus (2005-01-03 12:47) [9]Не, все мимо кассы, в ширь не идет.
Вообще конечная цель этих экспериментов получить массив всех файлов в данных подкаталагах. Но я решил разбить задачу на две и сначала получить все каталоги а потом просканировать их на наличие файлов. А можно быстро совместить эти два алгоритма?
← →
begin...end © (2005-01-03 12:49) [10]> [9] leonidus (03.01.05 12:47)
> Не, все мимо кассы, в ширь не идет.
А у массива dir длина-то достаточная?
> А можно быстро совместить эти два алгоритма?
Можно. См. ФАК.
← →
leonidus (2005-01-03 13:16) [11]Ну во-первых если массив переполнился программа сразу же возмутится, а во вторых он длиной 1000, при этом заполняется 4-я записями. А в факе а не нашел ничего, а поиск по сайту вообще криво работает...
← →
begin...end © (2005-01-03 13:20) [12]> [11] leonidus (03.01.05 13:16)
Приведите свой исправленный код.
> А в факе а не нашел ничего
Ну это свидетельствует лишь о том, что Вы плохо искали.
http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=1015254946&n=19
← →
leonidus (2005-01-03 13:42) [13]Благодарю покорнеше, сейчас попробую код из фака.
← →
begin...end © (2005-01-03 13:43) [14]> [13] leonidus (03.01.05 13:42)
А чего свой не хотите здесь привести? Просто интересно.
← →
leonidus (2005-01-03 14:02) [15]Да пожалуйста мне не жалко:
Function GetDir_(sDir : String):boolean;
var
iIndex : Integer;
SearchRec : TSearchRec;
sFileName : String;
begin
Result := False;
iIndex := FindFirst(sDir + "\*.*", FaAnyFile, SearchRec);
while iIndex = 0 do
Begin
if (SearchRec.Attr and faDirectory) > 0 then
begin
if (SearchRec.Name <> "" ) and (SearchRec.Name <> ".") and (SearchRec.Name <> "..") then
begin
inc(kol_dir);
dir[kol_dir]:=sDir + "\" + SearchRec.Name;
GetDir_(sDir + "\" + SearchRec.Name);
end;
end;
iIndex := FindNext(SearchRec);
End;
FindClose(SearchRec);
end;
← →
begin...end © (2005-01-03 16:54) [16]> [15] leonidus (03.01.05 14:02)
У меня этот код работает нормально.
← →
leonidus (2005-01-04 08:44) [17]Взял код из фака, вроде работает. Всем спасибо.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.044 c