Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2013, 17:33   #11
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
ТС, ответьте на несколько вопросов:
1) Такой поиск по всему диску C: должен выполняться уйму времени. Вы точно дожидаетесь окончания поиска?

2) Пробовали ли вы после окончания поиска поискать свои "потерявшиеся" файлы в середине/конце/любом_другом_месте_ списка (в вашей реализации там они и должны оказаться)?

---------

Если вам нужен вывод файлов и содержимого подпапок не вперемешку (вангую, что проблема именно в этом), а "упорядоченно, то предлагаю следующий вариант:

Код:
procedure TForm1.ScanFolder(Folder: String);
...
var localDirs: array of string;
i: integer;
...
 if (sr.Attr and faDirectory) = faDirectory then
     begin
      тут кладем FileName в массив localDirs
      Continue;
     end;
....
until FindNext(sr) <> 0;
   FindClose(sr);
   if (localDirs.Length>0) then
     for i:=0 to localDirs.Length - 1 do
       ScanFolder(localDirs[i]);
....
Главное чтобы памяти и размера стека хватило ))


P.S. memo1.Lines.SaveToFile(extractfilep ath(paramstr(0))+'log.txt'); вынесите из рекурсивного метода, это же ужасно!

1) Конца поиска не дожидался, форма виснет, и долго собирает все файлы да.
2)Нет

На счёт ванги: в точку, нужна именно порядочность файлов, сделал как вы и сказали, только выбивает

Сам код:

Код:
procedure TForm1.ScanFolder(Folder: String);
var
 sr: TSearchRec;
 FileName:String;
 localDirs: array of string;
 i,i2: integer;
begin
i2:=-1;
 if FindFirst(Folder+'\*.*', faAnyFile, sr) = 0 then
  begin
   repeat
    if (sr.Name='.') or (sr.Name='..') then
     continue;

    FileName := SlashSep(Folder, sr.Name);

    // Ýòî äèðåêòîðèÿ?
    if (sr.Attr and faDirectory) = faDirectory then
     begin
     { ScanFolder(FileName); }
      inc(i2);
      setlength(localdirs,i2);
      localdirs[i2]:=FileName;
      Continue;
     end;

    // Íàéäåí ôàéë
      Memo1.Lines.Add(FileName);
   until FindNext(sr) <> 0;
   FindClose(sr);
   if (length(localDirs)>0) then
     for i:=0 to length(localDirs) - 1 do
       ScanFolder(localDirs[i]);
  end;

end;
Подсвечивает делфи вот эту строчку :
ScanFolder(edLookIn.Text);

Использую Delphi 7
Winexcel вне форума Ответить с цитированием
Старый 30.10.2013, 17:38   #12
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

При первом найденном каталоге i2 равен 0. И что же тогда выделяет setlength(localdirs,i2);
?
northener вне форума Ответить с цитированием
Старый 30.10.2013, 17:45   #13
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

хочешь узнать правильный ответ (правильную ошибку) сделай так

Код:
i2:=-1;
inc(i2);
SetLength(localdir,i2); ??? какой длины будет массив
Localdir[i2]:=....; ?? в какой из имеющихся будет запись
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 30.10.2013, 17:46   #14
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
При первом найденном каталоге i2 равен 0. И что же тогда выделяет setlength(localdirs,i2);
?
Изменил на
Код:
i2:=0;
Результат аналогичный.
Winexcel вне форума Ответить с цитированием
Старый 30.10.2013, 17:46   #15
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Код:
setlength(localdirs,i2);
Правильно будет так:
Код:
setlength(localdirs,i2+1);
i2 - это длина массива. Она на единицу больше индекса последнего эемента

Цитата:
i2:=0;
Ужас. Теперь мы будем обращаться к несозданным элементам ))

Цитата:
1) Конца поиска не дожидался, форма виснет, и долго собирает все файлы да.
2)Нет
Второе есть следствие первого
Благодарить в репутацию. Проклинать — туда же

Последний раз редактировалось Luuzuk; 30.10.2013 в 17:49.
Luuzuk вне форума Ответить с цитированием
Старый 30.10.2013, 17:55   #16
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Вот так заработало:
Код:
procedure TForm1.ScanFolder(Folder: String);
var
 sr: TSearchRec;
 FileName:String;
 localDirs: array of string;
 i,i2: integer;
begin
i2:=-1;
 if FindFirst(Folder+'\*.*', faAnyFile, sr) = 0 then
  begin
   repeat
    if (sr.Name='.') or (sr.Name='..') then
     continue;

    FileName := SlashSep(Folder, sr.Name);

    // Ýòî äèðåêòîðèÿ?
    if (sr.Attr and faDirectory) = faDirectory then
     begin
     { ScanFolder(FileName); }
      inc(i2);
      setlength(localdirs,i2+1);
      localdirs[i2]:=FileName;
      Continue;
     end;

    // Íàéäåí ôàéë
      Memo1.Lines.Add(FileName);
   until FindNext(sr) <> 0;
   FindClose(sr);
   if (length(localDirs)>0) then
     for i:=0 to length(localDirs) - 1 do
       ScanFolder(localDirs[i]);
  end;

end;
После танцов с бубном =).
Luuzuk - Идея твоя мне тоже пришла сразу в голову реализовать запись каталогов в лист, затем уже запускать от туда. Но всё равно спасибо.
И всё же ваше рассуждение Luuzuk:
Цитата:
1) Такой поиск по всему диску C: должен выполняться уйму времени. Вы точно дожидаетесь окончания поиска?
Не совсем логично, так как процедура в это же время ищет данные файлы, а у меня в мемо было совсем другое, я думаю спустя 5-6 сек она бы закончила работу и файлы оказались бы хоть не так далеко от списка начальных при запуске, а их вообще не было...
Ах да ещё добавлю, что порядочность будет опять же при первом шаге, после рекурсии порядочности не будет...ведь тут может быть не один а сразу несколько каталогов, решение это ещё и добавление секции...

Последний раз редактировалось Winexcel; 30.10.2013 в 17:59.
Winexcel вне форума Ответить с цитированием
Старый 30.10.2013, 18:06   #17
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
Не совсем логично, так как процедура в это же время ищет данные файлы, а у меня в мемо было совсем другое, я думаю спустя 5-6 сек она бы закончила работу и файлы оказались бы хоть не так далеко от списка начальных при запуске, а их вообще не было...
Вы в корне не правы. Полное перечисление файлов на всем винте займет у вас минут ...надцать, о секундах речь не идет. И список оставшихся файлов из корня диска будет именно ближе к концу. Хотя все зависит от того, в каком порядке FindNext будет их находить
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 31.10.2013, 09:11   #18
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
так как процедура в это же время ищет данные файлы,
Какая процедура их (я так понимаю файлы в корневом каталоге) ищет? Та которую мы запустили первой?
Так вот она инициировала РЕКУРСИВНЫЙ (НО НЕ ПАРАЛЛЕЛЬНЫЙ) запуск самой себя и ждет!
А в мемо идут подкаталоги со все большей глубиной. рекурсия же!

Как только встретился каталог, то просмотреть его и дождаться окончания просмотра. вот что означает рекурсивный вызов.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 31.10.2013 в 09:19.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поставил delphi +indy. При компиляции исходника не находит его компонентов selevo Общие вопросы Delphi 0 15.04.2013 20:32
FileExists не находит половину файлов HellMercenariess Общие вопросы Delphi 4 08.09.2012 21:12
Программа, которая находит площадь трапеции, квадрата и прямоугольника по введённым длинам сторон (на Delphi) orange_wot Помощь студентам 3 10.04.2012 16:42
Не заносятся пути для всех файлов после FindFirst artemavd Общие вопросы Delphi 8 02.12.2010 10:20
FindFirst matus Помощь студентам 2 21.02.2008 19:34