![]() |
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! :) |
Re: Verzeichnisse loeschen die Nicht leer sind ?
Eine Möglichkeit mit Hilfe der Löschfunktion aus dem Explorer:
![]() |
Re: Verzeichnisse loeschen die Nicht leer sind ?
Zitat:
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. |
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. |
Re: Verzeichnisse loeschen die Nicht leer sind ?
ok leute,
erstmal dank für eure antworten. habe etwas gefunden das funktioniert
Delphi-Quellcode:
soweit sogut. aber ich moechte saemtliche geloeschten dateien in einem log protokollieren, was nicht geht, da ich nach dem anstoßen der funktion
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; keinen einfluss mehr darauf habe? muellt er mir bei dieser funktion den nich den windows papierkorb voll ? |
Re: Verzeichnisse loeschen die Nicht leer sind ?
Zitat:
Zitat:
|
Re: Verzeichnisse loeschen die Nicht leer sind ?
ok jungens, vielen dank
|
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:
Beispiel:
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;
Delphi-Quellcode:
2. Löschen von Verzeichnissen
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; Unit:
Delphi-Quellcode:
Beispiel:
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;
Delphi-Quellcode:
VerzLoeschen('c:\ordner');
|
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; |
Re: Verzeichnisse loeschen die Nicht leer sind ?
Moin TypusMensch,
dieser Teil hier
Delphi-Quellcode:
ist falsch.
and (rec.Name[1] <> '.')
Man muss explizit auf
Delphi-Quellcode:
prüfen, da führende Punkte in Datei-/Verzeichnisnamen zulässig sind.
and (rec.Name <> '.') and (rec.Name <> '..')
|
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