Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как удалить каталог через FileSystemObject?


Автор: Данкинг 14.11.2010, 02:22
Процедура удаления каталога:
Код

procedure TForm1.FormCreate(Sender: TObject);
var fs:variant;
begin
 fs:=createoleobject('scripting.FileSystemObject');
 fs.deletefolder('i:\musor\test');
end;

При этом удаляются все файлы в каталоге, но сам он не удаляется, возникает OLE-ошибка. То же происходит при наличии в каталоге подкаталогов: файлы из подкаталогов удаляются, но сам подкаталог - нет с той же ошибкой. Вопрос: как удалить каталог полностью, со всеми файлами и подкаталогами? smile 

Автор: RomanEEP 14.11.2010, 09:12
А так:
Код

fs.deletefolder('i:\musor\test', True);

Автор: ama_kid 14.11.2010, 09:45
Данкинг, у меня все нормально удаляется. Ошибка возникает только в случае, если папка используется (соответственно и не может удалиться). Ну и какбэ используемую папку гарантированно удалить сложно, у меня получилось только в Корзину методом, описанным http://forum.vingrad.ru/topic-111949.html, да и то только когда она перестает использоваться.

P.S. Ну а использовать второй параметр метода deleteFolder ты наверное пробовал.

Автор: Данкинг 14.11.2010, 14:07
Цитата(ama_kid @  14.11.2010,  09:45 Найти цитируемый пост)
P.S. Ну а использовать второй параметр метода deleteFolder ты наверное пробовал. 

Сейчас попробовал - результат тот же. smile Папка вроде и не используется, а пример по ссылке - 
Код

WinExec('cmd.exe /C RD /q /s D:\dir', SW_HIDE);

Удаляет все файлы, оставляя каталоги.

Добавлено @ 14:12
Вообще да, видимо, где-то держится эта папка в программе, в общем, буду искать.


А если быть точным, то мне нужно удалить не саму папку, а всё, что есть в ней. Т.е. папка остаётся, но пустая.

Автор: Akella 14.11.2010, 14:28
А Проводник удаляет папку?

Автор: Данкинг 14.11.2010, 15:43
Akella, разумеется, да и если просто удалить папку через fs.deletefolder (т.е. без того, что делает программа сначала - а она действительно лезет в этот каталог), то удаляется нормально. Поэтому, вероятно, намёк верный: в программе что-то папку держит, хотя я уже там закрыл всё, что можно (TDirectoryListBox и TFileListBox). Вечерком думаю попробовать сделать через 0пу: сначала удалить все файлы в данной папке, а затем уже ставшими пустыми подкаталоги через RemoveDir. Вдруг получится. smile 

Автор: ama_kid 14.11.2010, 15:53
Цитата(Данкинг @  14.11.2010,  16:43 Найти цитируемый пост)
Вдруг получится.
Имхо те же яйца только в профиль.
Попробуй менять активную директорию перед удалением каким-нибудь ChDir

Автор: Данкинг 14.11.2010, 18:50
Цитата(ama_kid @  14.11.2010,  15:53 Найти цитируемый пост)
Имхо те же яйца только в профиль.

Да, и правда...
Цитата(ama_kid @  14.11.2010,  15:53 Найти цитируемый пост)
Попробуй менять активную директорию перед удалением каким-нибудь ChDir

Аналогичный результат.


Автор: Данкинг 15.11.2010, 00:21
В общем, извратился окончательно: нужные пути к каталогам сохраняются в .txt, и сделал отдельную консольную программку, которую надо будет запускать после работы основной и которая удалит каталоги согласно этому .txt. smile 

Автор: Keeper89 15.11.2010, 00:55
Данкинг, в общем случае папка чем-то занята, т.е. какой-то процесс содержит хендл на эту папку (скорее всего твой собственный это и есть).
Посмотреть это можно с помощью утилиты http://ru.wikipedia.org/wiki/Unlocker, разблокировать через нее же.

Автор: Keeper89 15.11.2010, 01:32
И еще: http://blog.delphi-jedi.net/2010/11/14/is-file-in-use/

Автор: Данкинг 15.11.2010, 02:16
Keeper89, ну, запускать утилиты - это по сути то же самое, что и моя вторая консольная программка. smile 

Автор: ama_kid 15.11.2010, 07:58
Цитата(Данкинг @  14.11.2010,  19:50 Найти цитируемый пост)
Аналогичный результат.
SetCurrentDir('C:\') (возможно, с последующей задержкой на 1с перед удалением) тоже не поможет?

Автор: Данкинг 15.11.2010, 11:58
ama_kid, аналогично, даже с задержкой на 10 секунд. smile 

Автор: ama_kid 15.11.2010, 12:05
Данкинг, я бы на твоем месте последовательно повырезал бы (закомментировал) участки кода и посмотрел, после чего удаление становится возможным. Хотя, если тебя устраивает вариант с доп.консольной приблудой - то ок.

Автор: Данкинг 15.11.2010, 12:25
Цитата(ama_kid @  15.11.2010,  12:05 Найти цитируемый пост)
Хотя, если тебя устраивает вариант с доп.консольной приблудой - то ок. 

Я на работе ещё не тестил, но думаю, что всех всё устроит. smile 

Автор: Keeper89 16.11.2010, 09:12
Данкинг, я говорил про утилиту только чтобы посмотреть, кто держит папку. А дальше ищи что в коде или освобождай принудительно сам, как это делает анлокер.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)