Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.10;
Скачать: CL | DM;

Вниз

Как удалить директорию под 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
1-30746
Semu
2002-05-30 13:33
2002.06.10
Как сделать ожидание (аналог sleep())


1-30751
esVer
2002-05-28 15:31
2002.06.10
Русский язык в нерусской Windows


7-31032
Oks
2002-03-14 15:42
2002.06.10
Определение метки компакт диска


1-30778
Kviz
2002-05-30 21:32
2002.06.10
Люди, кто что то подобное видел слышал, имеет прдставление как, это делается, ПОМОГИТЕ!!! Вопрос насчёт иконки! Как изменить вид иконки в виндах в готовом EXE шнике.


8-30917
Basoil
2002-01-21 10:07
2002.06.10
Склеить несколько WAV файлов.