![]() |
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:
Aufgerufen wird die Routine z.B. so:
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; 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] |
Auf die Schnelle? Wahrscheinlich liegt´s am fehlenden Backslash:
Code:
Deine Prozedur baut daraus:
DeleteAll('c:\temp','*.*');
Code:
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.
c:\temp*.*
|
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 |
Schon mal probiert, was dir eben gesagt wurde? :roll:
|
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 |
Du sollst aus dem:
Delphi-Quellcode:
das
DeleteAll('c:\temp','*.*');
Delphi-Quellcode:
machen.
DeleteAll('c:\temp\','*.*');
|
Juhuuu :-)
ES klappt! Das das nur an dem Backslash (\) lag... naja egal danke für eure Hilfe! bis dann Trouble_Maker |
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 |
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): ![]() |
Zitat:
![]() ...:cat:... |
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 |
Re: Alle Dateien eines Verzeichnisses löschen ?!?
Sei doch mal so gut und poste Deinen geänderten Code ;-)
...:cat:... |
Re: Alle Dateien eines Verzeichnisses löschen ?!?
ich wusste das das kommt
aber schau mal was ich einen posting vorhergeschrieben habe.... Zitat:
in der while schleife nen zähler und ganz am ende ein Result greetz Marlno |
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. |
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] |
Re: Alle Dateien eines Verzeichnisses löschen ?!?
So, zwei kleine Fehlerchen sind da noch... waren die oben auch :?
Code:
P.S. FindClose sollte nur ausgeführt werden, wenn FindFirst erfolgreich war. Einige Delphi-Versionen verursachen auf einigen OS sonst AV.
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; Du kannst in Delphi/Pascal anstatt mit Ergebniss gleich mit Result arbeiten. ...:cat:... |
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; |
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 |
Re: Alle Dateien eines Verzeichnisses löschen ?!?
Hallo Marlno!
Zitat:
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:
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.
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; Gruß Dietmar Brüggendiek Edit: warum geht im Delphi-Source kein Color?? |
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 |
Re: Alle Dateien eines Verzeichnisses löschen ?!?
Moin Dietmar,
Zitat:
|
Re: Alle Dateien eines Verzeichnisses löschen ?!?
Du kannst aber auch [pre] nehmen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:33 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