Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 375

/ вопрос открыт /

Доброго времени суток, не подскажите почему пока не закроешь прогу не удаляется
каталог в котором эта прога произвела рекурсивный поиск?

Приложение:
  1. procedure GetAllFiles(mask: string);
  2. var
  3. search: TSearchRec;
  4. directory,s: string;
  5. i:integer;
  6. N:boolean;
  7. begin
  8. directory := ExtractFilePath(mask);
  9. if FindFirst(mask, faAnyFile, search) = 0 then begin
  10. repeat
  11. if Search.Attr <> faDirectory then begin
  12.  
  13. if Form1.ChkDouble1.Checked = True then begin
  14. N:=False;
  15. if Form1.Pl1.Items.Count <> 0 then
  16. for i:=0 to Form1.Pl1.Items.Count -1 do begin
  17. if PlayerClose then Break;
  18. if LowerCase(Form1.Pl1.Items.Strings[i]) = LowerCase(search.Name) then begin
  19. N:=True;
  20. Break;
  21. end;
  22. end;
  23. if N = True then begin
  24. S:='&#196;&#226;&#238;&#233;&#237;&#255;&#248;&#234;&#224; '+Search.Name;
  25. DoubleTrack:=DoubleTrack+1;
  26. DoubleList:=DoubleList+Search.Name+#10;
  27. end else S:=Search.Name;
  28. end else S:=Search.Name;
  29.  
  30. R:=Tregistry.Create;
  31. R.RootKey:=HKEY_LOCAL_MACHINE; R.OpenKey('SoftwareZelenokymsk@CorporationPlayerPlayList',True);
  32. R.WriteString(S,Directory+Search.Name);
  33. R.Destroy;
  34. Form1.Pl1.Items.Add(S);
  35.  
  36. end;
  37. until FindNext(search) <> 0;
  38. end;
  39. if FindFirst(directory + '*.*', faDirectory, search) = 0 then begin
  40. repeat
  41. if ((search.Attr and faDirectory) = faDirectory) and (search.Name[1] <> '.') then
  42. GetAllFiles(directory + search.Name + '' + ExtractFileName(mask));
  43. until FindNext(search) <> 0;
  44. FindClose(search);
  45. end;
  46. end;


DimonZ Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: DimonZ (статус: Посетитель)
Вопрос отправлен: 6 ноября 2009, 15:47
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 9 ноября 2009, 23:25; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 6 ноября 2009, 16:11 [#1]:

А откудова берется путь, который передается в процедуру? случайно не с OpenDialog'a?
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 6 ноября 2009, 19:11 [#2]:

Дадада, попробуй после поиска изменить текущую директорию.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DimonZ

DimonZ (статус: Посетитель), 7 ноября 2009, 11:07 [#3]:

Вадим, нет не с OpenDialog'a, путь передаётся 2-мя способами:
1.TCopyDataStruct;
2.ParamStr(0);
DimonZ

DimonZ (статус: Посетитель), 7 ноября 2009, 11:15 [#4]:

Дело даже не в параметрах, даже если задать директорию в Edit'е, то все равно нельзя удалить папку после поиска.
Вадим К

Вадим К (статус: Академик), 7 ноября 2009, 11:28 [#5]:

Одну утечку ресурсов нашел. между строк

until FindNext(search) <> 0;
end;
//здесь!!!!
if FindFirst(directory + '*.*', faDirectory, search) = 0 then begin
repeat

не хватает закрытия поиска, то есть вызова FindClose. Так как каталог не освобожден, вот его и держат. Сам код местами вызывает непонятые чувства.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 7 ноября 2009, 11:32 [#6]:

Цитата (Вадим К):

Одну утечку ресурсов нашел. между строк


Да, я тоже это нашёл, но только когда переформатировал код по-человечески, иначе он практически не поддавался анализу:

procedure GetAllFiles(mask: string);
var
  search: TSearchRec;
  directory,s: string;
  i: integer;
  N: boolean;
begin
  directory := ExtractFilePath(mask);
  if FindFirst(mask, faAnyFile, search) = 0
    then repeat
           if Search.Attr <> faDirectory
             then begin
                    if Form1.ChkDouble1.Checked
                      then begin
                             N:= False;
 
                             if Form1.Pl1.Items.Count <> 0
                               then for i:= 0 to Form1.Pl1.Items.Count - 1 do
                                      begin
                                        if PlayerClose
                                          then Break;
 
                                        if LowerCase(Form1.Pl1.Items.Strings[i]) = LowerCase(search.Name)
                                          then begin
                                                 N:=True;
                                                 Break;
                                               end;
                                      end;
 
                             if N
                               then begin
                                      S:= 'A"a^i^e'i'y"?e^a` ' + Search.Name;
                                      DoubleTrack:= DoubleTrack + 1;
                                      DoubleList:= DoubleList + Search.Name + #10;
                                    end
                               else S:= Search.Name;
                           end
                      else S:= Search.Name;
 
                    R:= Tregistry.Create;
                    R.RootKey:= HKEY_LOCAL_MACHINE;
                    R.OpenKey('SoftwareZelenokymsk@CorporationPlayerPlayList', True);
                    R.WriteString(S,Directory+Search.Name);
                    R.Destroy; // <--- плохая идея
                    Form1.Pl1.Items.Add(S);
                  end;
         until FindNext(search) <> 0;
 
  if FindFirst(directory + '*.*', faDirectory, search) = 0
    then begin
           repeat
             if ((search.Attr and faDirectory) = faDirectory) and (search.Name[1] <> '.')
               then GetAllFiles(directory + search.Name + '' + ExtractFileName(mask));
           until FindNext(search) <> 0;
 
           FindClose(search);
         end;
end;

Но всё равно для меня осталось тайной, чего автор хочет этим кодом добиться.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DimonZ

DimonZ (статус: Посетитель), 9 ноября 2009, 23:25 [#7]:

Большое спасибо товарищи эксперты, действительно косяк был в из-за не закрытого поиска, насчёт форматирования кода скажу
лишь что я привык так писать, вообщем у каждого своя

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:29
Выполнено за 0.03 сек.