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

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

Удаление файлов [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


Наверх

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