![]() |
Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Kann mir da jemand weiter helfen?
Also ich will 2-Listboxen durchen und die jeweiligen Verzeichnisse und Files in einem Stammverzeichnis löschen. Wie finde ich z.B: alle *.txt datei und kann diese löschen. Weiters... wie such ich bestimmte Ordner auch wenn sie im Unterverzeichnissen drinnen sind. |
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
FindFirst, FindNext sind Dein Freund. Oder Du installierst Dir meine Komponente
![]() |
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Da ich zufällig ein Projekt offen habe in dem sich diese Funktion befindet:
Delphi-Quellcode:
procedure GetFileList(Path, Ext: String; List: TStrings);
const Attrib = faArchive + faReadOnly + faHidden; var Search: TSearchRec; begin if Path[Length(Path)] <> '\' then Path := Path + '\'; if FindFirst(Path + '*' + Ext, Attrib, Search) = 0 then repeat List.Add(Path + Search.Name); until FindNext(Search) <> 0; FindClose(Search); end; |
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Ganz so einfach ist es wohl nicht, Rekursion fehlt z.B., man addiert keine Bitmasken, Du prüfst nicht auf Länge 0 usw.
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Zitat:
Im OH Beispiel wird auch addiert und nicht auf Länge 0 geprüft usw. Wenn das Beispiel falsch ist, dann biegt der Fehler bei Borland bzw. Nachfolger. Was die Rekursion angeht, ok, wie gesagt, ich habe diese Funktion so aus meinem Projekt kopiert und da brauche ich es nicht. :? |
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Soll heißen: wenn Du ein Beispiel liest, das suboptimal programmiert ist, übernimmst Du es, weil es ja von Borland/Inprise/CodeGear/Embarcadero stammt? Interessante Einstellung.
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Ja!
Wie schon gesagt: ich habe mal den Fehler begangen mich schon mal bei dieser Funktion auf eine Diskussion einzulassen. Derjenige konnte gut meckern, konnte aber keine Zeile Verbesserung anfügen. Ok, gehen wir mal die Sache anders an: ich programmiere mit Delphi, damit ich mich um den Sch... mit API & Co. nicht kümmern muß. Ich nutze die API wenn Delphi selbst eine Funktion nicht liefert. Wenn Delphi eine Funktion liefert, dann kann ich davon ausgehen, dass sie richtig ist. Warum? Weil ich paar hundert Euro dafür ausgegeben habe. Ich kann davon ausgehen, dass alle Fallstricke, also Punkte die ich beachten soll, in der OH vermerkt sind. Und da lasse ich mich mit Kommentaren wie "Interessante Einstellung" nicht als Idioten hinstellen, weil ich die Sprache so nutze wie es in der OH empfohlen wird. Wenn du auf dem Standpunkt stehst, dass das alles Idioten bei Borland waren und du es besser machst, dann akzeptiere ich das als deine Meinung. Aber lasse bitte davon ab andere da rein zu ziehen. |
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Auch die Leute von Borland waren nicht unfehlbar.
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Delphi-Quellcode:
Ein paar klitzkleine Änderungen, und das wird viel stabiler. Aber bitte, Du musst das ja nicht übernehmen.
procedure GetFileList(Path, Ext: String; List: TStrings);
const Attrib = faArchive or faReadOnly or faHidden; var Search: TSearchRec; begin Assert(Assigned(List)); Path := IncludeTrailingPathDelimiter(Path); //Delphi vor der Kylix-Ära: //Path := IncludeTrailingBackslash(Path); if FindFirst(Path + '*' + Ext, Attrib, Search) = 0 then try repeat List.Add(Path + Search.Name); until FindNext(Search) <> 0; finally FindClose(Search); end; end; |
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Warum die Gifterei?
bekommt Euch die Sonne nicht? Vielleicht wäre es besser gewesen,gleich zu sagen, daß sich hinter faReadonly und Konsorten Bits stecken, die gesetzt werden oder eben nicht gesetzt werden, und darum kann das Addieren gut gehen, aber genauso gut kann es daneben gehen, darum sollte man es sich garnicht angewöhnen. (Aber If-Schleifen am besten noch mit if a=true sind ja auch nicht auszurotten) @Detlef Jetzt hast Du aber auch die Längenprüfung für den Path unter den Tisch fallen lassen? Gruß K-H |
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Brauche ich nicht, das erledigt IncludeTrailingPathDelimiter von ganz alleine ;). Und ich habe ja gar nicht gegiftet, sondern nur darauf hingewiesen, dass da potentielle Fehlerquellen im Code stecken. Wenn Popov da gleich ausrastet, ist das sein Problem.
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Zitat:
Gruß K-H |
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Das hat nichts mit ausrasten zu tun sondern mit einer von oben herab Art. Es geht auch freundlicher.
Was deine Nullprüfung angeht, so hast du den wichtigsten Satz von mir überlesen: "Da ich zufällig ein Projekt offen habe in dem sich diese Funktion befindet". In diesem Fall ist es eine individuelle Funktion, von allem Balast befreit. Als Pfad kommt der Programmpfad plus Unterordner. Also kein Nullpfad da ein Programmpfad existiert. Für die Aufgabe für die sie gedacht ist funktioniert die Funktion fehlerfrei. Ich habe nichts gegen eine Verbesserung, aber wenn Kritik kommt, dann solte man zuerst den Hintergrund erfragen. Dann kann man. Dann zum try finally. Zwei Punkte: auch hier werde ich nicht schon wieder eine Diskussion darüber führen will, ob es nötig ist oder nicht. Ich bin der Meinung nein. Wozu? Ist schon paar Jahre her, aber ich bin der Meinung es ausdiskutiert zu haben. Und zweitens:
Delphi-Quellcode:
So wie es ist wird FindClose bei einem leeren Ordner nicht ausgeführt. Oder irre ich mich da?
if FindFirst(Path + '*' + Ext, Attrib, Search) = 0 then
try repeat List.Add(Path + Search.Name); until FindNext(Search) <> 0; finally FindClose(Search); end; |
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Du irrst nicht. In dem Falle ist das aber auch gar nicht nötig. Übrigens sollte man auch in individuellen Projekten immer mögliche Fehlerquellen ausschließen, das hat mit privatem Gebrauch oder dergleichen nichts zu tun. Ich denke da an einen Satz, den ich von einem Entwickler einmal gehört habe "Das ist kein Bug, es tritt ja nur in ganz speziellen Situationen auf.". Was soll man dazu noch sagen?
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Nicht nur in diesem Fall. FindFirst und FindNext liefern bereits Fehlercodes, d.h. deren Fehler wurden bereits abgefangen. Sie noch mal in ein Schutzblock stecken ist doppeltgemoppelt.
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Nur dass WinAPI Funktionen keine Delphi Exceptions auslösen.
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Es geht nicht um Exceptions. if FindFirst(...) = 0 then kein Fehler else Fehler.
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Ich sehe in deinem Code aber einen Except-Finally-Block. Oder wirft die VCL Kapselung eine Exception?
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
In welchem?
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Zitat:
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
So danke für deine hilfe (FileSearch) hat mir sehr dabei geholfen.
Wie stelle ich das nun mit den Ordnern an, also ich möchte in einem Stammverzeichnis nach bestimmten Ordnern suchen und diese löschen. |
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Redest Du jetzt von der Komponente? Wie sind die "bestimmten Ordner" denn definiert?
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Nein die komponente hab ich nicht gemeint ich hab bissal was daraus verwendet können und mir selbst was zusammengestöpselt... wollt eure unterhaltung in meinem thread nicht stören. jetzt wüsst ich gern wenn ich einen Ordner namens "Ordner1" in einem Verzeichnis löschen auch wenn er unterverzeichnisse hat in dem dieser Ordner enthalten sein könnte.
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Ich schlage vor, das Du das so machst wie es unter DOS mal notwendig war,
Code:
Gruß
Zu löschendes Verzeichnis suchen
:1 bis in das unterste Verzeichnis durchhangeln :2 alle Inhalte löschen : wenn startverzeichnis=aktuelles verzeichnis goto :ende eine Ebene zurück wenn Verzeichnisse enthalten sind goto :1 wenn nicht goto :2 :ende verzeichnis löschen K-H |
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Okay das zum löschen eines Verzeichnisses hab ich bereits hier in der community gefunden.. ich hab mir so überlegt, ich würde gern die pfade wo sich der Ordner oder wenn mehr in dem Stammverzeichnis vorkommen gerne an eine Stringlist übergeben.. aber wie suche ich nach einem Ordnernamen?
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Delphi-Quellcode:
Sollte Verzeichnisse finden, deren Name mit Test beginnt.
FindFirst(Pfad + 'Test*', faDirectory, SearchRec)
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Ja das FindFirst geht aber er durchsucht mir nicht die unterverzeichnisse :(
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Dann musst Du rekursiv suchen. Du hast doch meinen Quelltext, und in der Code-Library gibt es auch genügend Beispiele.
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
|
AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
Zitat:
Solltest du nur Ordner suchen, dann guck in der zweiten Hälfte wie nach Ordnern gesucht wird.
Delphi-Quellcode:
Bedenke bitte, dass du jetzt rekursiv arbeitest. Solltest du auf die Idee kommen List mit einem try except Block zu schützen, fliegt dir bei einer Exception die ganze Funktion um die Ohren, da wegen rekursiv dann immer wieder auf eine freigegebene TStrings-Liste zugegriffen wird.
//Liefert Datei-Liste laut Maske
procedure GetFiles(Path, ExtMask: String; List: TStrings; SubFolder: Boolean); var Attrib: Integer; Search: TSearchRec; begin if Length(Path) > 0 then if Path[Length(Path)] <> '\' then Path := Path + '\'; Attrib := faArchive or faReadOnly or faHidden;// damit es keinen Krach gibt if FindFirst(Path + '*.' + ExtMask, Attrib, Search) = 0 then repeat List.Add(Path + Search.Name); until FindNext(Search) <> 0; FindClose(Search); if SubFolder then begin if FindFirst(Path + '*.*', faDirectory, Search) = 0 then repeat if ((Search.Attr and faDirectory) = faDirectory) and (Search.Name[1] <> '.') then GetFiles(Path + Search.Name, ExtMask, List, SubFolder); until FindNext(Search) <> 0; FindClose(Search); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:13 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