Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
10-1080826752
serg128
2004-04-01 17:39
2005.01.16
Как в ClientDataSet заблокировать запись?


14-1104302001
Rouse_
2004-12-29 09:33
2005.01.16
C Днем Рождения 29 Декабря


3-1102329250
Yurij-7
2004-12-06 13:34
2005.01.16
Коректировка структуры DBF файла


6-1098873369
AlexX S. Sh.
2004-10-27 14:36
2005.01.16
Работа с модемом


3-1102404457
GekaNaz
2004-12-07 10:27
2005.01.16
Проблема дисконнекта в InterBase6.5





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский