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

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

Как удалить директорию под Windows NT [D5, NT4, Win2k]


Alexey_ ©   (2002-05-17 17:38:00) 

Мастера, подскажите, пожалуйста, как удалить директорию под Windows NT. У меня вложенные директории. Все вложенные директории и файлы я удаляю, делаю ту же процедуру и для основной своей директории, но она не удаляется. Точнее если ее создать и в этом-же сеансе программы удалить, то все работает. А если выйти из программы и запустить ее снова, то нет. Есть подозрение, что это связано с привелегиями. Кто-нибудь может помочь? Заранее благодарен.


Alexey_   (2002-05-30 10:52:00) [1]

Воспользовался подсказкой Nikolay M.Программа выдает ошибку EInOutError 32. Кто-нибудь может подсказать что это такое?

Алексей


Anatoly Podgoretsky   (2002-05-23 16:10:00) [2]

Alexey_ (23.05.02 12:46)
Не одна из функций не может удалять родительские каталоги, потому что в результате будет пустой диск. Если у тебя не удаляется каталог на текущем уровне и ниже, то только по причине или занят или запрещено удаления, например системный каталог, если эти требования выполнены, то SHFileOperation работает как часики и очень красиво, кроме того возможно у тебя просто ошибка в коде


Nikolay M.   (2002-05-23 15:42:00) [3]

Велосипед изобретаем? :)
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;


Alexey_   (2002-05-23 12:46:00) [4]

Кто-нибудь может мне объяснить, почему в NT не удаляет некоторые родительские каталоги?


Alexey_   (2002-05-22 15:00:00) [5]

Попробовал предыдущую процедуру. Она действительно все удаляет кроме исходной (той которую первоначально мы задаем для удаления). Ставил после процедуры RemoveDir(Name), но первоначальный каталог КАК РАЗ И НЕ УДАЛЯЕТ. Ставил CHdir, все равно не помогает. Блин!!!!


Tkach_   (2002-05-20 18:34:00) [6]

мне кажется, что неправильно написаны сами циклы очистки директории, в них и генерируется ошибка. Попробуйте следующее решение (работает во всех виндах):


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;




Anatoly Podgoretsky   (2002-05-20 17:49:00) [7]

PVOzerski © (20.05.02 13:07)
Это и есть один файл открыт, между каталогами и файлами разницы, используется


Alexey_   (2002-05-20 17:41:00) [8]

Каталог перед удалением менял с помощью Chdir. Файлы не открыты, т.к. каталог не содержит каких-то содержательных файлов. И они перед удалением каталога в любом случае все удаляются, сам проверял.
Если создавать каталоги в том-же сеансе программы и потом сразу удалить, то все работает. А если выйти из программы и запустить ее снова, то нет. Может в этом чего-то кроется. Не работает не только на моем компе.


PVOzerski   (2002-05-20 13:07:00) [9]

А еще может быть, что у Вас подлежащий удалению каталог - текущий.


Anatoly Podgoretsky   (2002-05-20 12:55:00) [10]

Дело в том, что у тебя открыт какой то файл в одном из каталогов


Alexey_   (2002-05-20 12:29:00) [11]

Попробовал функцию 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-18 15:38:00) [12]

SHFileOperation пример есть в FAQ


Alexey_   (2002-05-18 15:05:00) [13]

Операционная система 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);


ZZ   (2002-05-17 17:46:00) [14]

Какая файловая система? И приведи код создания и удаления каталогов.


Наверх

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