Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Alle Dateien eines Verzeichnisses löschen ?!? (https://www.delphipraxis.net/3574-alle-dateien-eines-verzeichnisses-loeschen.html)

Trouble_Maker 19. Mär 2003 10:45


Alle Dateien eines Verzeichnisses löschen ?!?
 
Hiho,
kann mir mal jemand sagen, wieso dieser Code nicht funktioniert ?!? :

Mit DeleteFile kann man leider nur einzelne Dateien löschen. Die folgende Procedure löscht sämtliche Dateien eines Verzeichnisses:

Delphi-Quellcode:
procedure DeleteAll(Dir, Files : string);
var
  SearchRec : TSearchRec;
begin
  if FindFirst(Dir+Files, faAnyFile, SearchRec) = 0 then
    begin
      DeleteFile(SearchRec.Name);
      while FindNext(SearchRec) = 0 do
        DeleteFile(Dir + SearchRec.Name);
    end;
  FindClose(SearchRec);
end;
Aufgerufen wird die Routine z.B. so:

DeleteAll('c:\temp','*.*');


Also bei mir klappt das nicht, also das Programm startet und gibt kein Fehler aus, aber die Dateien sind nicht gelöscht!

Danke

Trouble_Maker

[edit=sakura]Jahre später... Delphi-TAGs eingefügt *g* Mfg, sakura[/edit]

MathiasSimmack 19. Mär 2003 10:50

Auf die Schnelle? Wahrscheinlich liegt´s am fehlenden Backslash:
Code:
DeleteAll('c:\temp','*.*');
Deine Prozedur baut daraus:
Code:
c:\temp*.*
Alternativ schau dir doch mal "SHFileOperation" an. Dabei handelt es sich um die Shell-Funktion, die der Windows-Explorer zum Kopieren, Löschen und Verschieben benutzt. Vorteil: bei längeren Operationen hast du eine Fortschrittsanzeige, und (sofern aktiviert!) werden die Dateien im Papierkorb des Systems abgelegt ... Letzteres hängt davon ab, ob der User diese Funktionalität nutzt.

Trouble_Maker 19. Mär 2003 10:54

hmmm... ?
leider kenn ich mich noch nich soo gut in Delphi aus!
kann mir vielleicht jemand ein Code posten, wie ich Dateien in einem Verzeichnis löschen kann !?!

wäre nett...


Trouble_Maker

Luckie 19. Mär 2003 11:19

Schon mal probiert, was dir eben gesagt wurde? :roll:

Trouble_Maker 19. Mär 2003 11:21

nein hab ich nich, weil ich mich einfach noch nich gut genug auskenne! Ich hab (fast) keine Ahnung, was ich da anstellen soll

bitte schreibt einer nen Code :-D

Luckie 19. Mär 2003 11:24

Du sollst aus dem:
Delphi-Quellcode:
DeleteAll('c:\temp','*.*');
das
Delphi-Quellcode:
DeleteAll('c:\temp\','*.*');
machen.

Trouble_Maker 19. Mär 2003 11:50

Juhuuu :-)
ES klappt!

Das das nur an dem Backslash (\) lag... naja egal
danke für eure Hilfe!

bis dann

Trouble_Maker

Trouble_Maker 19. Mär 2003 12:06

so hab jetzt doch noch ne Frage *g*
Soweit klappt das alles, aber was is mit den Ordnern (in z.B. Windows\Temp\) ???
Die möchte ich auch gelöscht haben, weil ich mit einem klick mein Windows-Temp (etc..) löschen will!

Wie geht das mit den Ordnern löschen ?!?

Danke

Trouble_Maker

MathiasSimmack 19. Mär 2003 14:25

Du solltest mal die Suchfunktion bemühen. IMO existieren hier im Forum mehrere Lösungen. Das Zauberwort lautet "rekursiver" Aufruf, d.h. du musst in deiner Prozedur auch nach Ordnern suchen, dann in diese Ordner springen und die Prozedur erneut aufrufen.

Der EDH enthält ebenfalls ein Beispiel.

Aber spätestens hier wäre mein Vorschlag für die eleganteste und kürzeste Methode noch einmal der Verweis auf die Shell-Funktion SHFileOperation. Auch dafür sollte der EDH ein Beispiel enthalten.

Ansonsten (bei AUQ.de gefunden): http://www.swissdelphicenter.ch/en/showcode.php?id=152

sakura 19. Mär 2003 19:35

Zitat:

Zitat von MathiasSimmack
Du solltest mal die Suchfunktion bemühen.

oder in die Code-Library schauen.

http://www.delphipraxis.net/viewtopic.php?t=1451

...:cat:...

Marlno 23. Aug 2003 14:17

Re: Alle Dateien eines Verzeichnisses löschen ?!?
 
hab da mal ne frage hierzu.....
und zwar wenn ich die procedur aufrufe gibts 2 sachen die mich wundern (ich habe deshalb aus der procedur ne funktion mit integer rückgabewert gemacht zur überprüfung der anzahl)

wenn ich diese procedur/funktion benutze erhalte ich bei dem aufruf mit zb *.dat ein ergebnis wobei aber die aller erste .dat datei nicht gelöscht wird auch wenn nur eine einzige dat datei im verzeichnis liegt wird sie nie gelöscht (in meiner function deshalb auch integer 0)

zweitens wenn ich das aufrufe mit *.* dann wird mir immer eine (mein rückgabewert) höhere zahl angegeben als vorhanden das heißt bei 3 dateien sind es 4 und wenn gar keine datei drin ist dann trotzdem 1..

das kann doch nicht hinhauen
was ist denn das????
testet das doch mal bei euch..
kann jemand helfen???

ps es geht nicht um die umwandlung von procedur in function sondern um das abarbeiten der original procedur siehe oben...

greetz Marlno

sakura 23. Aug 2003 14:22

Re: Alle Dateien eines Verzeichnisses löschen ?!?
 
Sei doch mal so gut und poste Deinen geänderten Code ;-)

...:cat:...

Marlno 23. Aug 2003 14:25

Re: Alle Dateien eines Verzeichnisses löschen ?!?
 
ich wusste das das kommt
aber schau mal was ich einen posting vorhergeschrieben habe....

Zitat:

ps es geht nicht um die umwandlung von procedur in function sondern um das abarbeiten der original procedur siehe oben...
falls du dennoch was willst schreibs dir um mach einfach function rückgabewert ein integer

in der while schleife nen zähler
und ganz am ende ein Result


greetz Marlno

sakura 23. Aug 2003 14:31

Re: Alle Dateien eines Verzeichnisses löschen ?!?
 
Wenn ich mir die umschreibe, funktioniert es ohne Probleme. Deshalb sollst Du ja auch DEINEN Code posten :roll:

...:cat:...

P.S.: Ich habe Deinen Beitrag durchaus vollständig gelesen.

Marlno 23. Aug 2003 14:37

Re: Alle Dateien eines Verzeichnisses löschen ?!?
 
achso wusste ich ja nicht hättest du aber ruhig sagen können.... zb so

hi
wenn ich mir das umschreibe funktioniert es wunderbar

naja egal....

poste du doch auch einfach mal deins dann kanns jeder sehen *fg*


Bold sind die neuen

Code:
[b]Function[/b] DeleteAll(Dir, Files : string): [b]Integer[/b];
var
SearchRec : TSearchRec;
[b]ergebnis:integer;[/b]
begin
[b]ergebnis:=0;[/b]
if FindFirst(Dir+Files, faAnyFile, SearchRec) = 0 then
begin
DeleteFile(SearchRec.Name);
while FindNext(SearchRec) = 0 do
[b]begin[/b]
DeleteFile(Dir + SearchRec.Name);
[b]ergebnis:=ergebnis + 1;[/b]
[b]end;[/b]
end;
FindClose(SearchRec);
[b]Result:=ergebnis;[/b]
end;

so... aber sag mal wenn du 10 .dat dateien in ein ordner tust und die function oder die alte procedur mit *.dat aufrufst löscht er alle 10 ???
bei mir nämlich nur 9. :oops:

greetz Marlno

[edit=sakura]PRE-Tags gesetzt. Mfg, sakura[/edit]

sakura 23. Aug 2003 14:44

Re: Alle Dateien eines Verzeichnisses löschen ?!?
 
So, zwei kleine Fehlerchen sind da noch... waren die oben auch :?

Code:
Function DeleteAll(Dir, Files : string): Integer;
var
  SearchRec : TSearchRec;
  ergebnis:integer;
begin
  ergebnis:=0;
  if FindFirst(Dir+Files, faAnyFile, SearchRec) = 0 then
  begin
    DeleteFile([color=#ff0012]Dir+[/color]SearchRec.Name);
    [color=#ff0012]ergebnis:=ergebnis + 1;[/color]
    while FindNext(SearchRec) = 0 do
    begin
      DeleteFile(Dir + SearchRec.Name);
      ergebnis:=ergebnis + 1;
    end;
    [color=#ff0012]FindClose(SearchRec); [/color]
  end;
  [s][color=#ff0012]FindClose(SearchRec); [/color][/s]
  Result:=ergebnis;
end;
P.S. FindClose sollte nur ausgeführt werden, wenn FindFirst erfolgreich war. Einige Delphi-Versionen verursachen auf einigen OS sonst AV.

Du kannst in Delphi/Pascal anstatt mit Ergebniss gleich mit Result arbeiten.

...:cat:...

Christian Seehase 23. Aug 2003 15:24

Re: Alle Dateien eines Verzeichnisses löschen ?!?
 
Moin MarIno,

ausserdem könnte ein Resourcenschutzblock (try/finally) nicht schaden, um die Freigabe der belegten Resourcen sicherzustellen.
Bei Verwendung einer repeat/until Schleife wird das Ganze dann auch noch übersichtlicher.

Besonders wichtig:
Bei DeleteFile den genauen Pfad angeben (wie sakura ja schon geschrieben hat), da ansonsten wohl im aktuellen Arbeitsverzeichnis gelöscht wird, falls dort zufällig gleichnamige Dateien liegen sollten.

Delphi-Quellcode:
Function DeleteAll(Dir, Files : string): Integer;

var
  SearchRec : TSearchRec;

begin
  Result := 0;
  if FindFirst(Dir+Files, faAnyFile, SearchRec) = 0 then begin
    try
      repeat
        DeleteFile(Dir+SearchRec.Name);
        inc(Result);
      until FindNext(SearchRec) <> 0;
    finally
      FindClose(SearchRec);
    end;
  end;
end;

Marlno 23. Aug 2003 15:37

Re: Alle Dateien eines Verzeichnisses löschen ?!?
 
hey ja ihr habt ja beide recht....
und ja das war oben in der ersten version schon so.. die war ja nicht von mir ich dachte nur ich kann sie gebrauchen und mache einfach ne funktion draus mit der anzahl was ja auch ging also ich habe keine fehler gemacht die waren schon...

aber finde es klasse das man alte sachen verbessert auch hier im forum...

so nun zum löschen
eines geht jetzt wunderbar

nämlich das *.dat jetzt werden nämlich alle .dat datein gelöscht auch wenn nur eine vorhanden ist supi freu :hello:

nur doof ist das jetzt nicht immer eins höher ist sondern 2 höher im result beim aufruf *.*
naja egal wenn verzeichnisse drin wären würde ich es verstehen denn die zählt er ja auch mit aber es sind keine drin und auch keine versteckten oder system files oder sonstiges....

muss ich halt wenn *.* aufgerufen wird einfach 2 abziehen oder wenns viele files sind fällt das nicht mehr auf *hilfe bug*

naja zumindest die idee mit dem try finally ist gut...

wenn ihr sonst noch lösungen habt dann würde ich mich freuen...

greetz Marlno

Brüggendiek 23. Aug 2003 23:13

Re: Alle Dateien eines Verzeichnisses löschen ?!?
 
Hallo Marlno!

Zitat:

Zitat von Marlno
nur doof ist das jetzt nicht immer eins höher ist sondern 2 höher im result beim aufruf *.*
naja egal wenn verzeichnisse drin wären würde ich es verstehen denn die zählt er ja auch mit aber es sind keine drin und auch keine versteckten oder system files oder sonstiges....

Natürlich hast Du im Verzeichnis 2 Unterverzeichnisse - die heißen '.' und '..'! Probier mal in der DOS-Eingabeaufforderung DIR aus - da siehst Du es (außer im Hauptverzeichnis der Platte).
Bei dem geposteten Code werden die 'gelöscht' (das geht nicht, DeleteFile löscht nur Dateien, für leere Verzeichnisse ist RemoveDir zuständig).

Folgendes sollte klappen:
Delphi-Quellcode:
Function DeleteAll(Dir, Files : string): Integer;

var
  SearchRec : TSearchRec;

begin
  Result := 0;
  if FindFirst(Dir+Files, faAnyFile, SearchRec) = 0 then begin
    try
      repeat
        if (SearchRec.Attr and faDirectory) <> faDirectory then //einfügen
        begin       //einfügen
          DeleteFile(Dir+SearchRec.Name);
          inc(Result);
        end;   //einfügen
      until FindNext(SearchRec) <> 0;
    finally
      FindClose(SearchRec);
    end;
  end;
end;
Dann werden nur Dateien gelöscht, die keine Directorys sind. Nach dem neu einzufügenden "end" kannst Du auch noch, wenn der Namen ungleich '.' und ungleich '..' ist, die Funktion rekursiv aufrufen, um Unterdirs zu löschen! Nach dem Löschen der Dateien kannst Du ja Removedir versuchen.

Gruß

Dietmar Brüggendiek
Edit: warum geht im Delphi-Source kein Color??

Marlno 23. Aug 2003 23:24

Re: Alle Dateien eines Verzeichnisses löschen ?!?
 
hey klasse werd ich nacher mal ausprobieren
was so alles entsteht wenn man nur probieren wollte 8)

hey ja du hast recht die alten "dos" verzeichnisse hab ich vergesse
ich weiß das es . und .. gibt bestes beispiel cd.. eine ebene höher
und die bezeinung "dos" war nur darauf bezogen das man diese unter win einfach vergisst.....

*g*

danke das ist die lösung wie ich nicht selber draufgekommen bin *peinlich* dabei programmiert man doch schon seit jahren.. *grummel*

thx
greetz Marlno

Christian Seehase 23. Aug 2003 23:26

Re: Alle Dateien eines Verzeichnisses löschen ?!?
 
Moin Dietmar,

Zitat:

Zitat von Brüggendiek
warum geht im Delphi-Source kein Color??

weil dort die BBCodes nicht ausgewertet werden. Sonst gäb's Probleme mit Indizes (z.B. [ i] ohne das führende Blank)

Chewie 23. Aug 2003 23:30

Re: Alle Dateien eines Verzeichnisses löschen ?!?
 
Du kannst aber auch [pre] nehmen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 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