![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получить массив содержащий все поддирректории данной директории [D6, WinXP]
leonidus © (2005-01-03 11:47:00)Мастера подскажите советом. Есть директория с множеством вложенных папок, нужно задав начальный путь к даной директории просканировать ее и заполнить массив путями ко всем вложенным директориям. использую сделующий код:
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;
Он работает но сканирует не полностью. Подскажите пожалуйста где грабли.
leonidus (2005-01-04 08:44:00) [1]Взял код из фака, вроде работает. Всем спасибо.
begin...end (2005-01-03 16:54:00) [2]> [15] leonidus (03.01.05 14:02)
У меня этот код работает нормально.
leonidus (2005-01-03 14:02:00) [3]Да пожалуйста мне не жалко:
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 13:43:00) [4]> [13] leonidus (03.01.05 13:42)
А чего свой не хотите здесь привести? Просто интересно.
leonidus (2005-01-03 13:42:00) [5]Благодарю покорнеше, сейчас попробую код из фака.
begin...end (2005-01-03 13:20:00) [6]> [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:16:00) [7]Ну во-первых если массив переполнился программа сразу же возмутится, а во вторых он длиной 1000, при этом заполняется 4-я записями. А в факе а не нашел ничего, а поиск по сайту вообще криво работает...
begin...end (2005-01-03 12:49:00) [8]> [9] leonidus (03.01.05 12:47)
> Не, все мимо кассы, в ширь не идет.
А у массива dir длина-то достаточная?
> А можно быстро совместить эти два алгоритма?
Можно. См. ФАК.
leonidus (2005-01-03 12:47:00) [9]Не, все мимо кассы, в ширь не идет.
Вообще конечная цель этих экспериментов получить массив всех файлов в данных подкаталагах. Но я решил разбить задачу на две и сначала получить все каталоги а потом просканировать их на наличие файлов. А можно быстро совместить эти два алгоритма?
begin...end (2005-01-03 11:57:00) [10]> [7] leonidus (03.01.05 11:56)
Просто исправьте свой код с учётом [5].
leonidus (2005-01-03 11:56:00) [11]>Sandman25 а можно примерчик
Sandman25 (2005-01-03 11:54:00) [12][4] leonidus (03.01.05 11:53)
Это называется обход в глубину. Потом вернется на предыдущий уровень.
Если нужен обход в ширину, придется сначала записывать все каталоги, а только потом вызывать их обход.
Sandman25 (2005-01-03 11:53:00) [13]Тогда попробуйте
iIndex := FindFirst(sDir + '\*.*', FaAnyFile, SearchRec);
leonidus (2005-01-03 11:53:00) [14]сканирование идет в глубь по одной из дирректорий, не замечай другие направления
leonidus (2005-01-03 11:51:00) [15]Все равно не все сканируется
begin...end (2005-01-03 11:50:00) [16]> leonidus (03.01.05 11:47)
Для начала, замените if SearchRec.Attr = faDirectory thenна if (SearchRec.Attr and faDirectory) > 0 then. Сообщите о результатах.
Sandman25 (2005-01-03 11:49:00) [17]if SearchRec.Attr and faDirectory > 0 then