Текущий архив: 2008.12.07;
Скачать: CL | DM;
Вниз
Удаление файлов Найти похожие ветки
← →
b@v © (2008-10-28 14:24) [0]Подскажите как удалить из выбранной директории все файлы и пустые папки (каталоги). Т.е. каталог должен остаться и должен он быть пустым
← →
clickmaker © (2008-10-28 14:29) [1]FindFirst / FindNext / DeleteFile
← →
Anatoly Podgoretsky © (2008-10-28 14:40) [2]> b@v (28.10.2008 14:24:00) [0]
ShFileOperation
← →
Amoeba © (2008-10-29 00:07) [3]Файловые операции средствами ShellAPI:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=91
← →
Кирей (2008-10-29 15:53) [4]возникла похожая проблема, пасибо, паладин помог:
winexec("cmd /c del /Q c:\temp\*.*", SW_HIDE);
winexec("cmd /c rd /s /q c:\temp", SW_HIDE);
← →
stas © (2008-10-29 17:17) [5]не помню откуда
Function RemoveAll(sDir : String) : Boolean;
var
iIndex : Integer;
SearchRec : TSearchRec;
sFileName : String;
begin
Result := False;
sDir := sDir + "\*.*";
iIndex := FindFirst(sDir, faAnyFile, SearchRec);
while iIndex = 0 do begin
sFileName := ExtractFileDir(sDir)+"\"+SearchRec.Name;
if SearchRec.Attr = faDirectory then begin
if (SearchRec.Name <> "" ) and
(SearchRec.Name <> ".") and
(SearchRec.Name <> "..") then
RemoveDir(sFileName);
end else begin
if SearchRec.Attr <> faArchive then
FileSetAttr(sFileName, faArchive);
if NOT DeleteFile(sFileName) then
ShowMessage("Could NOT delete " + sFileName);
end;
iIndex := FindNext(SearchRec);
end;
FindClose(SearchRec);
RemoveDir(ExtractFileDir(sDir));
Result := True;
end
← →
b@v © (2008-10-30 11:35) [6]
> winexec("cmd /c del /Q c:\temp\*.*", SW_HIDE);
Классно работает, а как сделать так, если например у меня есть в этом каталоге еще куча подкаталогов, в которых тоже нужно удалить все файлы ?
← →
{RASkov} © (2008-10-30 11:49) [7]
type
TDelDirResult = record
DelFilesCount, DelDirsCount,
NoDelFilesCount, NoDelDirsCount: Integer;
end;
function DelDir(const PathDel: String; IsOnlyClearDir: Boolean): TDelDirResult; overload;
procedure RecurseDelete(ADir: String; var DDR: TDelDirResult);
procedure DeleteDir(const ADelDir: String);
begin
try
RmDir(ADelDir);
Inc(DDR.DelDirsCount);
except
Inc(DDR.NoDelDirsCount);
end;
end;
var SR: TSearchRec;
begin
ADir :=IncludeTrailingPathDelimiter(ADir);
if FindFirst(ADir + "*.*", faAnyFile, SR)=0 then
try
repeat
if (SR.Name = ".") or (SR.Name = "..") then Continue;
if (SR.Attr and faDirectory = faDirectory) then begin
RecurseDelete(ADir + SR.Name, DDR);
if IsOnlyClearDir then DeleteDir(ADir + SR.Name);
end else
if DeleteFile(ADir + "\" + SR.Name) then
Inc(DDR.DelFilesCount) else Inc(DDR.NoDelFilesCount);
until FindNext(SR) <> 0;
finally
FindClose(SR);
if not IsOnlyClearDir then DeleteDir(ADir)
end;
end;
begin
with Result do begin
DelFilesCount:=0;
DelDirsCount:=0;
NoDelFilesCount:=0;
NoDelDirsCount:=0;
end;
RecurseDelete(PathDel, Result);
end;
function DelDir(const PathDel: String): Boolean; overload;
var DDR: TDelDirResult;
begin
DDR:=DelDir(PathDel, False);
Result:=(DDR.NoDelFilesCount=0) and (DDR.NoDelDirsCount=0) and (DDR.DelDirsCount>0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with DelDir("C:\Temp", True) do
ShowMessage(Format("Удалено %d файлов, %d - директорий"#13#10"Пропущено: %d - файлов, %d - директорий"
, [DelFilesCount, DelDirsCount, NoDelFilesCount, NoDelDirsCount]));
//или
//if DelDir("C:\Temp") then ShowMessage("Успех") else ShowMessage("Провал");
end;
← →
{RASkov} © (2008-10-30 11:57) [8]Чтоб вообще каталоги оставлять(не удалять) то попробуй закомментировать строку:
repeat
if (SR.Name = ".") or (SR.Name = "..") then Continue;
if (SR.Attr and faDirectory = faDirectory) then begin
RecurseDelete(ADir + SR.Name, DDR);
//if IsOnlyClearDir then DeleteDir(ADir + SR.Name);
end else
if DeleteFile(ADir + "\" + SR.Name) then
Inc(DDR.DelFilesCount) else Inc(DDR.NoDelFilesCount);
until FindNext(SR) <> 0;
← →
Anatoly Podgoretsky © (2008-10-30 12:36) [9]
> а как сделать так, если например у меня есть в этом каталоге
> еще куча подкаталогов, в которых тоже нужно удалить все
> файлы ?
ShFileOperation
← →
b@v © (2008-10-30 13:12) [10]
> ShFileOperation
что то не пойму как эта функция работает !!! Может кто подскажет на примере ?
← →
Anatoly Podgoretsky © (2008-10-30 13:19) [11]> b@v (30.10.2008 13:12:10) [10]
Не ужели десятки тысяч примеров в Интернет не достаточно?
← →
b@v © (2008-10-30 14:14) [12]
> Не ужели десятки тысяч примеров в Интернет не достаточно?
Нашел примерчик, подкоректировал под себя, подскажите, в чем ошибка, выдает ошибку !!! "Не удается удалить файл. Не удается произчести чтение из файла или с диска"
procedure FileOperation (const source, dest: string; op, flags: Integer);
var
shf : TSHFileOpStruct;
s1,s2 : string;
begin
FillChar(shf, SizeOf (shf), #0);
s1 := source + #0#0;
s2 := dest + #0#0;
shf.Wnd := 0;
shf.wFunc := op;
shf.pFrom := PCHAR(s1);
shf.pTo := PCHAR(s2);
shf.fFlags := flags;
SHFileOperation(shf);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
put := DirectoryListBox1.Directory;
FileOperation (put + "\", "", FO_DELETE, FOF_ALLOWUNDO + FOF_NOCONFIRMATION);
end;
← →
b@v © (2008-10-30 14:24) [13]
procedure TForm1.Button3Click(Sender: TObject);
var
SHFileOpStruct : TSHFileOpStruct;
From : array [0..255] of Char;
begin
put := DirectoryListBox1.Directory;
SetCurrentDirectory(PChar(put + "\"));
From := "*.*" + #0;
with SHFileOpStruct do
begin
Wnd := Handle;
wFunc := FO_DELETE;
pFrom := @From;
pTo := nil;
fFlags := FOF_NOCONFIRMATION;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
SHFileOperation(SHFileOpStruct);
end;
Если так, то вообще все удаляет, а вложенные каталоги хотелось бы тока почистить, но оставить
← →
Anatoly Podgoretsky © (2008-10-30 14:54) [14]> b@v (30.10.2008 14:14:12) [12]
Сколько переменных, о значение которых приходится телепатировать!
← →
Amoeba © (2008-10-31 00:36) [15]
> b@v © (30.10.08 13:12) [10]
>
>
> > ShFileOperation
>
>
> что то не пойму как эта функция работает !!! Может кто подскажет
> на примере ?
Тебе уже дали ссылку на целую статью:
> Amoeba © (29.10.08 00:07) [3]
>
> Файловые операции средствами ShellAPI:
> http://www.delphikingdom.com/asp/viewitem.asp?catalogid=91
← →
Германн © (2008-10-31 01:05) [16]
> Тебе уже дали ссылку на целую статью:
Чукча не читатель. Ты код давай!
← →
Кирей (2008-10-31 09:58) [17]
> а как сделать так, если например у меня есть в этом каталоге
> еще куча подкаталогов, в которых тоже нужно удалить все
> файлы ?
Делаешь для папки, которую надо почистить
winexec("cmd /c rd /s /q c:\temp", SW_HIDE);только папка и файлы в ней не должны быть заняты
А потом создаешь опять эту папку.
Страницы: 1 вся ветка
Текущий архив: 2008.12.07;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.012 c