AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Verzeichnisse loeschen die Nicht leer sind ?
Thema durchsuchen
Ansicht
Themen-Optionen

Verzeichnisse loeschen die Nicht leer sind ?

Ein Thema von richard_boderich · begonnen am 18. Nov 2004 · letzter Beitrag vom 18. Nov 2004
Antwort Antwort
Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#1

Verzeichnisse loeschen die Nicht leer sind ?

  Alt 18. Nov 2004, 10:38
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!
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#2

Re: Verzeichnisse loeschen die Nicht leer sind ?

  Alt 18. Nov 2004, 10:47
Eine Möglichkeit mit Hilfe der Löschfunktion aus dem Explorer: Hier im Forum suchenSHFileOperation FO_DELETE
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Verzeichnisse loeschen die Nicht leer sind ?

  Alt 18. Nov 2004, 10:47
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.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
BKempf

Registriert seit: 1. Jun 2004
103 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: Verzeichnisse loeschen die Nicht leer sind ?

  Alt 18. Nov 2004, 10:52
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.
The problem with troubleshooting is that sometimes the trouble shoots back.
  Mit Zitat antworten Zitat
Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#5

Re: Verzeichnisse loeschen die Nicht leer sind ?

  Alt 18. Nov 2004, 11:46
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 ?
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#6

Re: Verzeichnisse loeschen die Nicht leer sind ?

  Alt 18. Nov 2004, 12:13
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.
  Mit Zitat antworten Zitat
Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#7

Re: Verzeichnisse loeschen die Nicht leer sind ?

  Alt 18. Nov 2004, 12:33
ok jungens, vielen dank
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat
TypusMensch

Registriert seit: 29. Aug 2003
Ort: Goth-A
182 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Verzeichnisse loeschen die Nicht leer sind ?

  Alt 18. Nov 2004, 12:50
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:
VerzLoeschen('c:\ordner');
Angehängte Dateien
Dateityp: rar tm_unit.rar (50,9 KB, 18x aufgerufen)
  Mit Zitat antworten Zitat
Vjay

Registriert seit: 2. Dez 2003
Ort: Berlin/Eschede
481 Beiträge
 
Delphi 7 Professional
 
#9

Re: Verzeichnisse loeschen die Nicht leer sind ?

  Alt 18. Nov 2004, 13:05
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;
Wer später bremst ist eher tot.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Verzeichnisse loeschen die Nicht leer sind ?

  Alt 18. Nov 2004, 21:37
Moin TypusMensch,

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

Man muss explizit auf
and (rec.Name <> '.') and (rec.Name <> '..') prüfen, da führende Punkte in Datei-/Verzeichnisnamen zulässig sind.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz