Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Verzeichnisse loeschen die Nicht leer sind ? (https://www.delphipraxis.net/34147-verzeichnisse-loeschen-die-nicht-leer-sind.html)

richard_boderich 18. Nov 2004 09:38


Verzeichnisse loeschen die Nicht leer sind ?
 
hallo,

ich habe ne routine die mir in "d:\muell" recursiv den inhalt loescht, allerdings nur die dateien.
ich moechte aber, damit das ganze etwas schneller wird, das er auch verzeichnisse loescht, in dehnen noch dateien sind.
habe Removedir probiert, aber das loescht nur leere verzeichisse. meinen recursiven algorythmus muss ich jetz 2 mal
laufen lassen, einmal um alle dateien zu entfernen, und einmal um die verzeichnisse zu loeschen, dat ist mir zu umstaendlich.
hat den keine n bessere loesung, oder gibst da ne api für bei windows gehts ja auch?

danke schonmal für Eure Zeit! :)

MathiasSimmack 18. Nov 2004 09:47

Re: Verzeichnisse loeschen die Nicht leer sind ?
 
Eine Möglichkeit mit Hilfe der Löschfunktion aus dem Explorer: Hier im Forum suchenSHFileOperation FO_DELETE

Sharky 18. Nov 2004 09:47

Re: Verzeichnisse loeschen die Nicht leer sind ?
 
Zitat:

Zitat von richard_boderich
.... meinen recursiven algorythmus muss ich jetz 2 mal
laufen lassen, einmal um alle dateien zu entfernen, und einmal um die verzeichnisse zu loeschen, ...

Hai Richard,
warum muss er denn zweimal laufen? Prüfe doch ob Du in dem "untersten" Ordner bist, wenn Ja lösche dort alle Dateien, gehe eine Ordnerebene zurück und lösche dann den Ordner.

BKempf 18. Nov 2004 09:52

Re: Verzeichnisse loeschen die Nicht leer sind ?
 
Tiefensuche.
Ich würde sowas wahrscheinlich so realisieren, daß ich alle Unterverzeichnisse des zu löschenden Verzeichnisses erstmal in eine Stringlist packe und mich dann rekursiv um alle Unterverzeichnisse kümmere.
Nachdem die Unterverzeichnisse abgearbeitet wurden, kann ich sie dann löschen (da sie ja leer sind), ebenso wie alle Dateien des aktuellen Verzeichnisses.

Edit: Beim näheren Hinsehen stelle ich fest, daß selbst die Stringlist überflüssig ist.

richard_boderich 18. Nov 2004 10:46

Re: Verzeichnisse loeschen die Nicht leer sind ?
 
ok leute,
erstmal dank für eure antworten. habe etwas gefunden das funktioniert

Delphi-Quellcode:
function DelDir(dir: string): Boolean;
uses
ShellApi;
...
var
  fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc := FO_DELETE;
    fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
    pFrom := PChar(dir + #0);
  end;
  Result := (0 = ShFileOperation(fos));
end;
soweit sogut. aber ich moechte saemtliche geloeschten dateien in einem log protokollieren, was nicht geht, da ich nach dem anstoßen der funktion
keinen einfluss mehr darauf habe?

muellt er mir bei dieser funktion den nich den windows papierkorb voll ?

MathiasSimmack 18. Nov 2004 11:13

Re: Verzeichnisse loeschen die Nicht leer sind ?
 
Zitat:

Zitat von richard_boderich
soweit sogut. aber ich moechte saemtliche geloeschten dateien in einem log protokollieren, was nicht geht, da ich nach dem anstoßen der funktion
keinen einfluss mehr darauf habe?

In dem Fall müsstest du deine eigene Funktion optimieren ;) und mit LOG ausrüsten. :)

Zitat:

muellt er mir bei dieser funktion den nich den windows papierkorb voll ?
Na ja, es ist ja die Löschfunktion von Windows. Und wenn dein Papierkorb als solcher aktiv ist (sprich: Sicherung der gelöschten Dateien), dann landen die natürlich auch dort.

richard_boderich 18. Nov 2004 11:33

Re: Verzeichnisse loeschen die Nicht leer sind ?
 
ok jungens, vielen dank

TypusMensch 18. Nov 2004 11:50

Re: Verzeichnisse loeschen die Nicht leer sind ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
1. Zählen von Dateien und/oder Verzeichnissen über einen Parameter. Es kann auch Rekursiv gesucht werden.

Unit:
Delphi-Quellcode:
function GetDirFileFolderCount(dir: string; subdir: Boolean; FileCount : Boolean = True; FolderCount : Boolean = False): Int64;
var
  rec            : TSearchRec;
  found          : Integer;
  intFileCount   : Int64;
  intFolderCount : Int64;
begin
  Result := 0;
  dir := IncludeTrailingPathDelimiter(dir);
  found := FindFirst(dir + '*.*', faAnyFile, rec);
  while found = 0 do
  begin
    if (rec.Attr and faDirectory > 0) and (rec.Name[1] <> '.') and FolderCount then Inc(Result);
    if (rec.Attr and faDirectory = 0) and (rec.Name[1] <> '.') and FileCount then Inc(Result);
    if (rec.Attr and faDirectory > 0) and (rec.Name[1] <> '.') and subdir then Inc(Result, GetDirFileFolderCount(dir + rec.Name, subdir, FileCount,FolderCount));
    found := FindNext(rec);
  end;
  FindClose(rec);
end;
Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
  // Nur Files
  Label1.Caption :=
  IntToStr(GetDirFileFolderCount('C:\programme',False,True,False));
  // Nur Folder
  Label2.Caption :=
  IntToStr(GetDirFileFolderCount('C:\programme',False,False,True));
  // Files und Folder
  Label3.Caption :=
  IntToStr(GetDirFileFolderCount('C:\programme',False,True,True));
  // REKURSIV
  // Nur Files
  Label4.Caption :=
  IntToStr(GetDirFileFolderCount('C:\programme',True,True,False));
  // Nur Folder
  Label5.Caption :=
  IntToStr(GetDirFileFolderCount('C:\programme',True,False,True));
  // Files und Folder
  Label6.Caption :=
  IntToStr(GetDirFileFolderCount('C:\programme',True,True,True));
Screen.Cursor := crDefault;
end;
2. Löschen von Verzeichnissen

Unit:
Delphi-Quellcode:
function VerzLoeschen(Verzeichnis : String) : Boolean;
var
  fos : TSHFileOpStruct;
begin
  ZeroMemory(@fos,SizeOf(fos));
  with fos do
  begin
    wFunc := FO_DELETE;
    fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
    pFrom := PChar(Verzeichnis + #0);
  end;
  RESULT := (0 = ShFileOperation(fos));
end;
Beispiel:
Delphi-Quellcode:
VerzLoeschen('c:\ordner');

Vjay 18. Nov 2004 12:05

Re: Verzeichnisse loeschen die Nicht leer sind ?
 
Und ohne Shelloperation:

Delphi-Quellcode:
{** Löscht einen Ordner mit allen Unterordnern "RM /S"}
function Deltree( Dir: string): Boolean;
 procedure Del(const Dir: string);
 var
  SearchRec: TSearchRec;
  Found: Cardinal;
 begin
  FindFirst( Dir + '*.*', faAnyFile, SearchRec);
  FindNext( SearchRec);
  Found := FindNext( SearchRec);
  while ( Found = 0) do
  begin
   SetFileAttributes( PChar(Dir + SearchRec.Name), FILE_ATTRIBUTE_NORMAL);
   if (SearchRec.Attr and faDirectory >0) then Del(Dir + SearchRec.Name + '\')
   else DeleteFile(Dir + SearchRec.Name);
   Found := FindNext(SearchRec);
  end;
  FindClose( SearchRec);
  RemoveDirectory(pchar(dir));
 end;
begin
  Dir:= IncludeTrailingPathDelimiter( Dir);
  Result := True;
  if DirectoryExists(Dir) then
  begin
    Del(Dir);
    if DirectoryExists(Dir) then Result := False;
  end
  else Result := False;
end;

Christian Seehase 18. Nov 2004 20:37

Re: Verzeichnisse loeschen die Nicht leer sind ?
 
Moin TypusMensch,

dieser Teil hier
Delphi-Quellcode:
and (rec.Name[1] <> '.')
ist falsch.

Man muss explizit auf
Delphi-Quellcode:
and (rec.Name <> '.') and (rec.Name <> '..')
prüfen, da führende Punkte in Datei-/Verzeichnisnamen zulässig sind.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz