Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:42 Uhr.
Seite 2 von 3     12 3      

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