![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
подскажите пожалуста почему не полностью удаляется dir [D7, Win95/98]
ceval © (2004-12-27 13:18:00)Во время выполнения программы создаю директорию
.............
Dir :=Edit1.Text + '\' + FormatDateTime('yyyymmdd', Date); //
if ForceDirectories(Dir) then
Fmain.Label_dir.Caption :='Путь: ' + Dir ;
и нужно если нажать кнопку Cancel эта директория удалилась
пишу такой код:
.............
procedure TFmain.cancelClick(Sender: TObject)
....
Dir :=Fedit.Edit1.Text + '\' + FormatDateTime('yyyymmdd', Date) ;
RemoveDir(dir);
При создании dir создается например С:\Temp\20041227
а при нажатии Cancel удаляется только папка 20041227 а Temp остается
Подскажите почему не удаляется все вместе ???
Как удалить все полностью ???
begin...end (2004-12-28 08:23:00) [1]> [14] vecna © (28.12.04 01:12)
Странно то, что за директорию считаются только элементы с ТОЛЬКО ОДНИМ атрибутом - faDirectory. Если каталог будет, например, ещё и скрытый, то для него поле SearchRec.Attrбудет равно faDirectory or faHidden, что НЕ равно f aDirectory, и поэтому такой объект за каталог не посчитается. Проверка должна быть такой: if SearchRec.Attr and faDirectory > 0then...
vecna (2004-12-28 01:12:00) [2]begin...end
>Странная проверка...
Что в ней странного ?
begin...end (2004-12-27 21:38:00) [3]> [11] Vit@ly © (27.12.04 18:20)
> if SearchRec.Attr = faDirectorythen
Странная проверка...
Fay (2004-12-27 21:35:00) [4]>> if (SearchRec.Name <> '' ) and
А так бывает?
Vit@ly (2004-12-27 18:20:00) [5]How can delete a directory with its files and subdirectories?
Function MyRemoveDir(sDir : String) : Boolean;
var
iIndex : Integer;
SearchRec : TSearchRec;
sFileName : String;
begin
Result := False;
sDir := sDir + '\*.*';
iIndex := FindFirst(sDir, faAnyFile, SearchRec);
while iIndex = 0 do begin
sFileName := ExtractFileDir(sDir)+'\'+SearchRec.Name;
if SearchRec.Attr = faDirectory then begin
if (SearchRec.Name <> '' ) and
(SearchRec.Name <> '.') and
(SearchRec.Name <> '..') then
MyRemoveDir(sFileName);
end else begin
if SearchRec.Attr <> faArchive then
FileSetAttr(sFileName, faArchive);
if NOT DeleteFile(sFileName) then
ShowMessage('Could NOT delete ' + sFileName);
end;
iIndex := FindNext(SearchRec);
end;
FindClose(SearchRec);
RemoveDir(ExtractFileDir(sDir));
Result := True;
end;
Example:
if NOT MyRemoveDir('D:\myDir') then
ShowMessage('Can NOT delete dir');
Note:
(1) Any system/hidden/read-only files will be deleted.
Jay1982 (2004-12-27 17:50:00) [6]Рекурсивная ф-ция удаления с подкаталогами:
function DeleteDir(Dir : string) : boolean;
Var
Found : integer;
SearchRec : TSearchRec;
begin
result:=false;
if IOResult<>0 then ;
ChDir(Dir);
if IOResult<>0 then begin
ShowMessage('Не могу войти в каталог: '+Dir); exit;
end;
Found := FindFirst('*.*', faAnyFile, SearchRec);
while Found = 0 do
begin
if (SearchRec.Name<>'.')and(SearchRec.Name<>'..') then
if (SearchRec.Attr and faDirectory)<>0 then begin
if not DeleteDir(SearchRec.Name) then exit;
end else
if not DeleteFile(SearchRec.Name) then begin
ShowMessage('Не могу удалить файл: '+SearchRec.Name); exit;
end;
Found := FindNext(SearchRec);
end;
FindClose(SearchRec);
ChDir('..'); RmDir(Dir);
result:=IOResult=0;
end;
Jay1982 (2004-12-27 17:48:00) [7]Извини забылся, моя ф-ция в конечном счёте делает RemoveDir
begin...end (2004-12-27 17:45:00) [8]> [6] Jay1982 © (27.12.04 17:31)
> Удаляй по очереди сначала DeleteDir('C:\qwer\20041227'),
> а потом DeleteDir('C:\qwer')
Что такое DeleteDir, не подскажешь?
begin...end (2004-12-27 17:42:00) [9]> [5] ceval © (27.12.04 17:09)
Наиболее правильный, на мой взгляд, вариант (SHFileOperation) уже посоветовали в [1].
Jay1982 (2004-12-27 17:31:00) [10]Удаляй по очереди сначала DeleteDir('C:\qwer\20041227'), а потом DeleteDir('C:\qwer')
ceval (2004-12-27 17:09:00) [11]"и корневой каталог (c:\) тоже почему-то не удаляет. очень, очень подозрительно."
Начнем стого что С:\ диск а не каталог
а Temp для примера там может быть что угодно "12233" и "wegh"
указываю в Edit1 "С:\qwer\"
создается c:\qwer\20041227
Хорошо тупанул немного :(
Но тогда как удалить созданную директорию "qwer\20041227"
Но тогда как мне удалить созданную директорию
Zhekson (2004-12-27 15:22:00) [12]ламер © (27.12.04 14:48) [2]
в самую тютельку...
Arm79 (2004-12-27 15:00:00) [13]ламер © (27.12.04 14:48) [2]
%^)
ламер (2004-12-27 14:48:00) [14]ceval © (04.12.27 13:18)
в самом деле. очень странно. RemoveDir('C:\temp\tmp1') не удаляет каталог c:\temp. и корневой каталог (c:\) тоже почему-то не удаляет. очень, очень подозрительно.
Arm79 (2004-12-27 13:43:00) [15]Либо удалять по очереди каждую папку, а не иерархию в целом, либо попытаться воспользоваться shFileOperation. Может и ошибся в названии, не помню точно.