Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.12;
Скачать: CL | DM;

Вниз

В каком модуле описана DeleteFolder   Найти похожие ветки 

 
TStas ©   (2006-02-24 23:43) [0]

А то приходится писать самому. CopyFolder написал сразу и без запинок, а здесь заприночка естьь - удаляет все, за исключением самой себя.
И второй вопрос: Нельзя ли как-то снять у всей папки атрибуты только чтение, а то очень неприятно делать это руками, кагда папка переписана с диска


 
Джо ©   (2006-02-24 23:49) [1]

> TStas ©   (24.02.06 23:43)

По п.1 — В стандартных модулях такой нет. Я для себя делал так:

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;

(Хотя кое-кто над этим кодом тут посмеивался, меня он устраивает :^)


 
TStas ©   (2006-02-24 23:56) [2]

Джо, глянь в начинающих, ну чего ж не хочет саму-то папку удалять. За ответ спасибо огромное


 
Джо ©   (2006-02-25 00:07) [3]

Сорри, под рукой не оказалось реального исходника, поэтому запостил копию чернового (тот, который когда-то в форум выкладывал). В реальном было как-то так:


type
 EDeleteFileSystemObjectError = class (Exception);
...
procedure PurgeDir (const DirName: TFileName; DeleteRoot: Boolean = True);
var
 DirList,
 FileList: TStrings;
 I: Integer;
 Fn: string;
begin
 DirList := TStringList.Create;
 try
   FileList := TStringList.Create;
   try
     ScanDirectory(DirName,FileList,DirList);

     try
       // Delete all files
       for I := FileList.Count-1 downto 0 do
       begin
         Fn := FileList[I];
         if not DeleteFile(Fn) then
           RaiseLastOSError;
       end;

       // Delete all directories
       for I := DirList.Count-1 downto 0 do
       begin
         Fn := DirList[I];
         if not RemoveDir(Fn) then
           RaiseLastOSError;
       end;

       // Delete a root, if specified
       if DeleteRoot then
       begin
         Fn := DirName;
         if not RemoveDir(Fn) then
           RaiseLastOSError;
       end;

       except
         on E: EOSError do
           raise EDeleteFileSystemObjectError.CreateFmt("Error deleting: %s (%s)",[Fn,E.Message])
         else
           raise
       end;
   finally
     FileList.Free;
   end;
 finally
   DirList.Free;
 end;
end;


Всё куда-то тороплюсь...



Страницы: 1 вся ветка

Текущий архив: 2006.03.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.065 c
1-1139479968
Новенький
2006-02-09 13:12
2006.03.12
D 2005 DFM Binary - > Text


2-1140679161
nap<>
2006-02-23 10:19
2006.03.12
TFileStream


15-1140197456
Ученик чародея
2006-02-17 20:30
2006.03.12
Как можно уменьшить сложность разработки больших комплексов.


15-1139896062
Ega23
2006-02-14 08:47
2006.03.12
С Днём рождения! 14 февраля


2-1140712917
Firefly
2006-02-23 19:41
2006.03.12
Разделение строки