Форум: "WinAPI";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];
ВнизКак удалить дирректорию с файлами? Найти похожие ветки
← →
Zak3D[@Tm] © (2005-07-22 13:24) [0]Собственно нужна помощь по решению сабжа =).
← →
Anatoly Podgoretsky © (2005-07-22 13:26) [1]ShFileOperation
← →
alpet © (2005-07-22 13:32) [2]из командной строки (утилита deltree есть в составе Win98):
deltree dirname.
Используя функцию ShellAPI:
var fs: SHFILEOPSTRUCT;
begin
fs.hwnd := 0;
fs.wFunc := FO_DELETE;
fs.pFrom := "X:\Windows"; // select your folder to delete
fs.pTo := nil;
fs.flags := FOF_NOCONFIRMATION + FOF_NOERRORUI + FOF_SILENT;
fs.hNameMappings := 0;
fs.lpszProgressTitle := nil;
SHFileOperation (fs);
end;
← →
Джо © (2005-07-22 13:45) [3]Ежли не заморачиваться насчет WinAPI, то можно навернуть вот такое рекурсивное удаление:
unit ScanUtils;
interface
uses SysUtils, Classes;
// осторожно, удаляет все вложенные под-директории и файлы :0)
// Параметр DeleteRoot определяет, удалять ли саму указанную директорию
procedure PurgeDir (const DirName: TFileName; DeleteRoot: Boolean = True);
implementation
procedure ScanDirectory (const Root: TFileName; const
FileLst,DirLst: TStrings);
var
DirInfo: TSearchRec;
FileAttr: Word;
begin
FileAttr := faDirectory;
if FindFirst(Root+"\*.*",FileAttr,DirInfo) = 0 then
begin
repeat
if (DirInfo.Attr and FileAttr) <> 0 then
begin
if (DirInfo.Name <> ".") and (DirInfo.Name <> "..") then
begin
DirLst.Add(Root+"\"+ DirInfo.Name);
ScanDirectory(Root+"\"+ DirInfo.Name,FileLst,DirLst);
end
end
else
FileLst.Add(Root+"\"+DirInfo.Name);
until FindNext(DirInfo) <> 0;
end;
FindClose (DirInfo);
end;
procedure PurgeDir (const DirName: TFileName; DeleteRoot: Boolean = True);
var
DirList,
FileList: TStrings;
I: Integer;
begin
DirList := TStringList.Create;
try
FileList := TStringList.Create;
try
ScanDirectory(DirName,FileList,DirList);
for I := FileList.Count-1 downto 0 do
DeleteFile(FileList[I]);
for I := DirList.Count-1 downto 0 do
RemoveDir(DirList[I]);
if DeleteRoot then
RemoveDir(DirName)
finally
FileList.Free;
end;
finally
DirList.Free;
end;
end;
end.
← →
Anatoly Podgoretsky © (2005-07-22 13:49) [4]Ну ни фига ты и накрутил, а еще про заморочки что то говоришь. Главное и ближайшей ошибке выскочишь из исполнения.
← →
Джо © (2005-07-22 13:51) [5]
> [4] Anatoly Podgoretsky © (22.07.05 13:49)
Анализ ошибок предоставляю производить автору топика, дабы суть примера была ясна.
А накрутил нормально, обычный рекурсивный обход всего дерева вложенности.
← →
Fay © (2005-07-22 14:10) [6]2 Джо © (22.07.05 13:45) [3]
Просто на редкость некрасивое решение.
← →
Джо © (2005-07-22 14:13) [7]
> [6] Fay © (22.07.05 14:10)
> Просто на редкость некрасивое решение.
Зато чрезвычайно понятное и прозрачное. В моей системе понятий это означает "красивое". Но раз уж зашла речь, приведи свое.
← →
Fay © (2005-07-22 14:33) [8]2 Джо © (22.07.05 14:13) [7]
ОКprocedure TForm1.DelDir(cDir : string);
var
h : THandle;
fd : _WIN32_FIND_DATAA;
fn, s : string;
begin
h := FindFirstFile(PChar(cDir + "\*"), fd);
if h = INVALID_HANDLE_VALUE then
RaiseLastOSError;
repeat
fn := fd.cFileName;
s := cDir + "\" + fn;
if (fd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
begin
if not Windows.DeleteFile(PChar(s)) then
RaiseLastOSError;
end
else if (string(fn) <> ".") and (string(fn) <> "..") then
DelDir(s);
until not FindNextFile(h, fd);
Windows.FindClose(h);
if not RemoveDirectory(PChar(cDir)) then
RaiseLastOSError;
end;
procedure TForm1.Button1Click(Sender : TObject);
begin
DelDir(edDir.Text);
end;
← →
Джо © (2005-07-22 14:42) [9]
> [8] Fay © (22.07.05 14:33)
На мой вкус - некрасивое решение. Решаются 2 разные задачи - рекурсивный обход + удаление. Я предпочитаю их для ясности не сливать в одну.
← →
Fay © (2005-07-22 14:44) [10]2 Джо © (22.07.05 14:42) [9]
Дя... Тяжкий случай...
← →
Fay © (2005-07-22 14:48) [11]2 Джо © (22.07.05 14:42) [9]
>> Решаются 2 разные задачи
Решается одна задача - "как удалить дирректорию с файлами?".
← →
Джо © (2005-07-22 14:51) [12]
> [9] Джо © (22.07.05 14:42)
Более того, функцию PurgeDir я, в первом приближении к рабочему варианту сделал бы даже так:
procedure PurgeDir (const DirName: TFileName; DeleteRoot: Boolean = True);
var
DirList,
FileList: TStrings;
procedure DeleteFiles (AFiles: TStrings);
var
I: Integer;
begin
for I := 0 to AFiles.Count-1 do
if not DeleteFile (AFiles[I]) then
raise Exception.Create("Can not delete file specified");
end;
procedure DeleteDirectories (ADirs: TStrings);
var
I: Integer;
begin
for I := 0 to ADirs.Count-1 do
if not RemoveDir(ADirs[I]) then
raise Exception.Create("Can not delete a directory specified");
end;
begin
DirList := TStringList.Create;
try
FileList := TStringList.Create;
try
ScanDirectory(DirName,FileList,DirList);
DeleteFiles(FileList);
DeleteDirectories(DirList);
if DeleteRoot then
RemoveDir(DirName)
finally
FileList.Free;
end;
finally
DirList.Free;
end;
end;
← →
Fay © (2005-07-22 14:52) [13]string(fn) - приведение, конечно, лишнее.
Забыл убрать после заведения переменной fn 8)
← →
Джо © (2005-07-22 14:54) [14]
> [11] Fay © (22.07.05 14:48)
> 2 Джо © (22.07.05 14:42) [9]
> >> Решаются 2 разные задачи
> Решается одна задача - "как удалить дирректорию с файлами?".
В таком случае, любую программу можно сделать в виде одной большой процедуры, решающей одну прикладную задачу. Успехов.
← →
Джо © (2005-07-22 15:02) [15]
> [10] Fay © (22.07.05 14:44)
> 2 Джо © (22.07.05 14:42) [9]
> Дя... Тяжкий случай...
После этого "Я использую GOTO и мне пофиг, что думают об этом остальные" меня не удивляет ваша реакция.
← →
Fay © (2005-07-22 15:06) [16]2 Джо © (22.07.05 14:54) [14]
>> В таком случае, любую программу можно сделать в виде одной большой процедуры, решающей одну прикладную задачу
Впервые пришло в голову?!
Вы по образованию строитель(лесник, военный, юрист), что ли?
← →
Джо © (2005-07-22 15:11) [17]
> [16] Fay © (22.07.05 15:06)
Вот вам и предоставляю делать программы по такому рецепту. Тем более, что вы, видимо, к нему очень склонны.
--
П.С. А мои персоналии, будьте добры, обсуждайте где-нибудь за пивом с друзьями, но так, что бы я этого не услышал, пожалуйста.
← →
Fay © (2005-07-22 15:15) [18]2 Джо © (22.07.05 15:11) [17]
>> П.С. ...
Уже
← →
Fay © (2005-07-22 15:33) [19]2 Джо © (22.07.05 15:11) [17]
Ладно, извини, если чем досадил.
Настроение не очень и мне не надо было срываться на тебе.
Признаю - бы не прав, хотя код [3] и [12] мне действительно не нравится, ну да это мои проблемы.
← →
Zak3D[@Tm] © (2005-07-22 15:42) [20]Спасибо, всё работает =)
← →
Джо © (2005-07-22 15:43) [21]
> [19] Fay © (22.07.05 15:33)
Да ладно ;-) В таком случае, свои резкие замечания также беру обратно. Надеюсь, настроение уже лучше.
← →
Fay © (2005-07-22 15:44) [22]2 Джо © (22.07.05 15:43) [21]
Значительно 8)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.011 c