Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

Получить массив содержащий все поддирректории данной директории   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.043 c
3-1102874458
korvin
2004-12-12 21:00
2005.01.16
Парадокс с выходными данными в серверной процедуре


1-1104831644
Dammit
2005-01-04 12:40
2005.01.16
Как создать обработчик события при нажатии на кнопки Развернуть?


14-1104096982
ArMellon
2004-12-27 00:36
2005.01.16
Нужна программа- телефон для внутреннего модема


4-1101344192
Fay
2004-11-25 03:56
2005.01.16
Animation Controls


1-1104155784
Gear
2004-12-27 16:56
2005.01.16
Delphi 2005 и Compact Framework .NET