Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-30746
Semu
2002-05-30 13:33
2002.06.10
Как сделать ожидание (аналог sleep())


3-30729
roman001
2002-05-19 19:27
2002.06.10
SQL-DMO


1-30758
opezhvv
2002-05-30 15:48
2002.06.10
Изменение размера компонентов


1-30779
"Мастер"
2002-05-30 23:40
2002.06.10
У меня к вам вопрос, мастера!


1-30815
AlexPotemkin
2002-05-31 12:08
2002.06.10
About ListBox and Mouse





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский