Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
1-1202923120
Ukrainec
2008-02-13 20:18
2008.12.07
Как отослать комбинацию клавиш Ctrl+V Opere?


10-1150700024
nickmas
2006-06-19 10:53
2008.12.07
Передача данных между COM-сервером и COM-клиентом


2-1224955331
Саня
2008-10-25 21:22
2008.12.07
Обработка гиперссылок в TWebbrowser


2-1225178052
zxc
2008-10-28 10:14
2008.12.07
Взять строку в двойные кавычки


2-1224877637
worldmen
2008-10-24 23:47
2008.12.07
Не видит PlaySound