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

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

Как грамотно стиреть директорию ? [D5, Win95/98, WinXP]


JohnKorsh ©   (2005-02-09 08:48:00) 

Не поможете ли с таким вопросом: Я очистил директорию стандартными методами (FindFirst, Erase, потом FindNext, Erase в цикле) но после этого сама директория не стирается, хотя и пустая. (RmDir) (После очистки текущую директорию я сменил). При отладке пишется ошибка I/O 32, но в Help I/O ошибки начинаются с N 105.
При повторном запуске программы эта директория успешно стирается.
Может от последнего FindNext остается кака-то I/O ошибка, так как бы ее удалить ?


JohnKorsh   (2005-02-09 10:34:00) [1]

Спасибо, помогло. (FindClose, а SHFileOperation еще лучше)


begin...end   (2005-02-09 10:26:00) [2]

> JohnKorsh   (09.02.05 10:16) [4]

Во-первых, вот это:

> AssignFile(F, Search.Name);
> Erase (F)

можно заменить на DeleteFile.

Во-вторых, в очищаемой папке не может быть подкаталогов? Если они там всё же могут быть, то следует добавить рекурсивное удаление в подпапках.

В-третьих, см. [5].

В-четвёртых, чем всё-таки так не нравится SHFileOperation?


Плохиш   (2005-02-09 10:20:00) [3]

FindClose где?


JohnKorsh   (2005-02-09 10:16:00) [4]

Извините, текст длинноват, но вот он:

        My_Doc_Dir := ShellDir ('Personal');        
// Ищу My Documents на данном компьютере.

        if My_Doc_Dir = '' then My_Doc_Dir := 'C:\';

        ChDir (My_Doc_Dir);          
// Перехожу в My Documents.

        if DirectoryExists (My_Doc_Dir + Init_Dir) then    
// Смотрю есть ли моя директория и перехожу в неё.
         begin
          ChDir (My_Doc_Dir + '\' + Init_Dir);

// Всё чищу в директории.

          if FindFirst (My_Doc_Dir + Init_Dir + '\*.*',
                        faAnyFile, Search) = 0 then
           begin
            if ((Search.Name <> '.') and (Search.Name<> '..'))  then
             begin
              FileSetAttr (Search.Name, $20);
              AssignFile(F, Search.Name);
              Erase (F);
             end;
           end;

          While FindNext (Search) = 0 do
           begin
            if ((Search.Name <> '.') and (Search.Name <> '..')) then
             begin
              FileSetAttr (Search.Name, $20);
              AssignFile(F, Search.Name);
              Erase (F);
             end;
           end;
         end;

    ChDir (My_Doc_Dir);    // Перехожу в My Documents.

    if DirectoryExists (Init_Dir) then
     begin
      try
       RmDir (Init_Dir);
// Вот здесь при отладке возникает IO 32.
      except
      end;
     end;

   end;


Fay   (2005-02-09 09:26:00) [5]

2 JohnKorsh   (09.02.05 08:48)
Какие-то ошибки неоходимо исправлять каким-то способом.
Запиши, чтобы не забыть.


begin...end   (2005-02-09 09:07:00) [6]

> JohnKorsh   (09.02.05 8:48)

Можно ещё воспользоваться API-функцией SHFileOperation. Тогда каталог даже не придётся очищать перед удалением.


КаПиБаРа   (2005-02-09 08:52:00) [7]

Код приведи


Наверх

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