|
Вопрос # 3 375/ вопрос открыт / |
|
Доброго времени суток, не подскажите почему пока не закроешь прогу не удаляется
каталог в котором эта прога произвела рекурсивный поиск?
Приложение: Переключить в обычный режим- 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 begin
- repeat
- if Search.Attr <> faDirectory then begin
-
- if Form1.ChkDouble1.Checked = True 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 = True then begin
- S:='Äâîéíÿøêà
'+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;
- end;
- 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;
 |
Вопрос задал: DimonZ (статус: Посетитель)
Вопрос отправлен: 6 ноября 2009, 15:47
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 9 ноября 2009, 23:25; участников в обсуждении: 3.
|
Вадим К (статус: Академик), 6 ноября 2009, 16:11 [#1]:
А откудова берется путь, который передается в процедуру? случайно не с OpenDialog'a?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 6 ноября 2009, 19:11 [#2]:
Дадада, попробуй после поиска изменить текущую директорию.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
DimonZ (статус: Посетитель), 7 ноября 2009, 11:07 [#3]:
Вадим, нет не с OpenDialog'a, путь передаётся 2-мя способами:
1.TCopyDataStruct;
2.ParamStr(0);
|
|
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™ (статус: Доктор наук), 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 (статус: Посетитель), 9 ноября 2009, 23:25 [#7]:
Большое спасибо товарищи эксперты, действительно косяк был в из-за не закрытого поиска, насчёт форматирования кода скажу
лишь что я привык так писать, вообщем у каждого своя
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|