Форум: "Основная";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];
ВнизКак удалить директорию под Windows NT Найти похожие ветки
← →
Alexey_ (2002-05-17 17:38) [0]Мастера, подскажите, пожалуйста, как удалить директорию под Windows NT. У меня вложенные директории. Все вложенные директории и файлы я удаляю, делаю ту же процедуру и для основной своей директории, но она не удаляется. Точнее если ее создать и в этом-же сеансе программы удалить, то все работает. А если выйти из программы и запустить ее снова, то нет. Есть подозрение, что это связано с привелегиями. Кто-нибудь может помочь? Заранее благодарен.
← →
ZZ (2002-05-17 17:46) [1]Какая файловая система? И приведи код создания и удаления каталогов.
← →
Alexey_ (2002-05-18 15:05) [2]Операционная система Windows NT
Код создания директории:
mkdir("c:\rn\out"+namedir");
mkdir("c:\rn\in"+namedir");
mkdir("c:\rn\out"+namedir+"\arc");
mkdir("c:\rn\in"+namedir+"\arc");
Код удаления директории:
SearchFileName := FindFirst("c:\rn\out"+namedir+"\arc\*.*", faAnyFile, SearchRec1);
If SearchFileName = 0
then
begin
repeat
DeleteFile("C:\RN\out"+namedir+"\arc\"+SearchRec1.Name);
SearchFileName := FindNext(SearchRec1);
until SearchFileName <> 0;
end;
FindClose(SearchRec1);
SearchFileName := FindFirst("c:\rn\in"+namedir+"\arc\*.*", faAnyFile, SearchRec1);
If SearchFileName = 0
then
begin
repeat
DeleteFile("C:\RN\in"+namedir+"\arc\"+SearchRec1.Name);
SearchFileName := FindNext(SearchRec1);
until SearchFileName <> 0;
end;
FindClose(SearchRec1);
RemoveDir("c:\rn\out"+namedir+"\arc");
RemoveDir("c:\rn\in"+namedir+"\arc");
SearchFileName := FindFirst("c:\rn\out"+namedir+"\*.*",faAnyFile, SearchRec1);
If SearchFileName = 0
then
begin
repeat
DeleteFile("C:\RN\out"+namedir+"\"+SearchRec1.Name);
SearchFileName := FindNext(SearchRec1);
until SearchFileName <> 0;
end;
FindClose(SearchRec1);
SearchFileName := FindFirst("c:\rn\in"+namedir+"\*.*", faAnyFile, SearchRec1);
If SearchFileName = 0
then
begin
repeat
DeleteFile("C:\RN\in"+namedir+"\"+SearchRec1.Name);
SearchFileName := FindNext(SearchRec1);
until SearchFileName <> 0;
end;
FindClose(SearchRec1);
RemoveDir("c:\rn\out"+namedir);
RemoveDir("c:\rn\in"+namedir);
← →
Anatoly Podgoretsky (2002-05-18 15:38) [3]SHFileOperation пример есть в FAQ
← →
Alexey_ (2002-05-20 12:29) [4]Попробовал функцию SHFileOperation.
Выдает ошибку:
Cannot remove folder (name): There has been a sharing violation. The source destination filename be in use.
У меня стоит Win2000, пишу для WIN NT.
В конференции прочел, что эта функция для WIN 95. Может в этом дело?
← →
Anatoly Podgoretsky (2002-05-20 12:55) [5]Дело в том, что у тебя открыт какой то файл в одном из каталогов
← →
PVOzerski (2002-05-20 13:07) [6]А еще может быть, что у Вас подлежащий удалению каталог - текущий.
← →
Alexey_ (2002-05-20 17:41) [7]Каталог перед удалением менял с помощью Chdir. Файлы не открыты, т.к. каталог не содержит каких-то содержательных файлов. И они перед удалением каталога в любом случае все удаляются, сам проверял.
Если создавать каталоги в том-же сеансе программы и потом сразу удалить, то все работает. А если выйти из программы и запустить ее снова, то нет. Может в этом чего-то кроется. Не работает не только на моем компе.
← →
Anatoly Podgoretsky (2002-05-20 17:49) [8]PVOzerski © (20.05.02 13:07)
Это и есть один файл открыт, между каталогами и файлами разницы, используется
← →
Tkach_ (2002-05-20 18:34) [9]мне кажется, что неправильно написаны сами циклы очистки директории, в них и генерируется ошибка. Попробуйте следующее решение (работает во всех виндах):
procedure FindInDir(Name:String);
var
sr: TSearchRec;
begin
if FindFirst(Name+"*.*", faAnyFile, sr) = 0 then
begin
If ((sr.Attr and faDirectory)=sr.Attr)and(sr.Name<>".")and(sr.Name<>"..")then
begin
FindInDir(Name+"\"+sr.Name+"\*.*");
RemoveDir(Name+"\"+sr.Name+"\");
end
else
if sr.Attr and faDirectory<>sr.Attr then DeleteFile(Name+"\"+sr.Name);
while FindNext(sr) = 0 do
begin
If ((sr.Attr and faDirectory)=sr.Attr)and(sr.Name<>".")and(sr.Name<>"..")then
begin
FindInDir(Name+"\"+sr.Name+"\*.*");
RemoveDir(Name+"\"+sr.Name+"\");
end
else if sr.Attr and faDirectory<>sr.Attr then DeleteFile(Name+"\"+sr.Name);
end;
FindClose(sr);
end;
end;
begin
...............
FindInDir("c:\temp\");
...............
end;
← →
Alexey_ (2002-05-22 15:00) [10]Попробовал предыдущую процедуру. Она действительно все удаляет кроме исходной (той которую первоначально мы задаем для удаления). Ставил после процедуры RemoveDir(Name), но первоначальный каталог КАК РАЗ И НЕ УДАЛЯЕТ. Ставил CHdir, все равно не помогает. Блин!!!!
← →
Alexey_ (2002-05-23 12:46) [11]Кто-нибудь может мне объяснить, почему в NT не удаляет некоторые родительские каталоги?
← →
Nikolay M. (2002-05-23 15:42) [12]Велосипед изобретаем? :)
ClearDir из RX не спасет отца русской демократии? Ну, если нет RX, вот код ClearDir (сорьки, если не по теме):
function ClearDir(const Path: string; Delete: Boolean): Boolean;
const
{$IFDEF WIN32}
FileNotFound = 18;
{$ELSE}
FileNotFound = -18;
{$ENDIF}
var
FileInfo: TSearchRec;
DosCode: Integer;
begin
Result := DirExists(Path);
if not Result then Exit;
DosCode := FindFirst(NormalDir(Path) + "*.*", faAnyFile, FileInfo);
try
while DosCode = 0 do begin
if (FileInfo.Name[1] <> ".") and (FileInfo.Attr <> faVolumeID) then
begin
if (FileInfo.Attr and faDirectory = faDirectory) then
Result := ClearDir(NormalDir(Path) + FileInfo.Name, Delete) and Result
else if (FileInfo.Attr and faVolumeID <> faVolumeID) then begin
if (FileInfo.Attr and faReadOnly = faReadOnly) then
FileSetAttr(NormalDir(Path) + FileInfo.Name, faArchive);
Result := DeleteFile(NormalDir(Path) + FileInfo.Name) and Result;
end;
end;
DosCode := FindNext(FileInfo);
end;
finally
FindClose(FileInfo);
end;
if Delete and Result and (DosCode = FileNotFound) and
not ((Length(Path) = 2) and (Path[2] = ":")) then
begin
RmDir(Path);
Result := (IOResult = 0) and Result;
end;
end;
← →
Anatoly Podgoretsky (2002-05-23 16:10) [13]Alexey_ (23.05.02 12:46)
Не одна из функций не может удалять родительские каталоги, потому что в результате будет пустой диск. Если у тебя не удаляется каталог на текущем уровне и ниже, то только по причине или занят или запрещено удаления, например системный каталог, если эти требования выполнены, то SHFileOperation работает как часики и очень красиво, кроме того возможно у тебя просто ошибка в коде
← →
Alexey_ (2002-05-30 10:52) [14]Воспользовался подсказкой Nikolay M.Программа выдает ошибку EInOutError 32. Кто-нибудь может подсказать что это такое?
Алексей
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c