![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление файлов [D7, XP]
b@v © (2008-10-28 14:24:00)Подскажите как удалить из выбранной директории все файлы и пустые папки (каталоги). Т.е. каталог должен остаться и должен он быть пустым
Кирей (2008-10-31 09:58:00) [1]
> а как сделать так, если например у меня есть в этом каталоге
> еще куча подкаталогов, в которых тоже нужно удалить все
> файлы ?
Делаешь для папки, которую надо почистить
winexec('cmd /c rd /s /q c:\temp', SW_HIDE);только папка и файлы в ней не должны быть заняты
А потом создаешь опять эту папку.
Германн (2008-10-31 01:05:00) [2]
> Тебе уже дали ссылку на целую статью:
Чукча не читатель. Ты код давай!
Amoeba (2008-10-31 00:36:00) [3]
> 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
Anatoly Podgoretsky (2008-10-30 14:54:00) [4]> b@v (30.10.2008 14:14:12) [12]
Сколько переменных, о значение которых приходится телепатировать!
b@v (2008-10-30 14:24:00) [5]
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;
Если так, то вообще все удаляет, а вложенные каталоги хотелось бы тока почистить, но оставить
b@v (2008-10-30 14:14:00) [6]
> Не ужели десятки тысяч примеров в Интернет не достаточно?
Нашел примерчик, подкоректировал под себя, подскажите, в чем ошибка, выдает ошибку !!! "Не удается удалить файл. Не удается произчести чтение из файла или с диска"
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;
Anatoly Podgoretsky (2008-10-30 13:19:00) [7]> b@v (30.10.2008 13:12:10) [10]
Не ужели десятки тысяч примеров в Интернет не достаточно?
b@v (2008-10-30 13:12:00) [8]
> ShFileOperation
что то не пойму как эта функция работает !!! Может кто подскажет на примере ?
Anatoly Podgoretsky (2008-10-30 12:36:00) [9]
> а как сделать так, если например у меня есть в этом каталоге
> еще куча подкаталогов, в которых тоже нужно удалить все
> файлы ?
ShFileOperation
{RASkov} (2008-10-30 11:57:00) [10]Чтоб вообще каталоги оставлять(не удалять) то попробуй закомментировать строку:
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;
{RASkov} (2008-10-30 11:49:00) [11]
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;
b@v (2008-10-30 11:35:00) [12]
> winexec('cmd /c del /Q c:\temp\*.*', SW_HIDE);
Классно работает, а как сделать так, если например у меня есть в этом каталоге еще куча подкаталогов, в которых тоже нужно удалить все файлы ?
stas (2008-10-29 17:17:00) [13]не помню откуда
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
Кирей (2008-10-29 15:53:00) [14]возникла похожая проблема, пасибо, паладин помог:
winexec('cmd /c del /Q c:\temp\*.*', SW_HIDE);
winexec('cmd /c rd /s /q c:\temp', SW_HIDE);
Amoeba (2008-10-29 00:07:00) [15]Файловые операции средствами ShellAPI:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=91
Anatoly Podgoretsky (2008-10-28 14:40:00) [16]> b@v (28.10.2008 14:24:00) [0]
ShFileOperation
clickmaker (2008-10-28 14:29:00) [17]FindFirst / FindNext / DeleteFile