Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

подскажите пожалуста почему не полностью удаляется 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. Может и ошибся в названии, не помню точно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо