Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получить массив содержащий все поддирректории данной директории [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо