Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen (https://www.delphipraxis.net/167152-bestimmte-dateien-und-verzeichnise-einem-stammverzeichnis-loeschen.html)

t0mmy 15. Mär 2012 14:12

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.

DeddyH 15. Mär 2012 14:52

AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
 
FindFirst, FindNext sind Dein Freund. Oder Du installierst Dir meine Komponente TFileSearcher, dann musst Du das nicht selber erledigen.

Popov 15. Mär 2012 14:59

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;

DeddyH 15. Mär 2012 15:12

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.

Popov 15. Mär 2012 15:36

AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
 
Zitat:

Zitat von DeddyH (Beitrag 1156729)
Ganz so einfach ist es wohl nicht, Rekursion fehlt z.B., man addiert keine Bitmasken, Du prüfst nicht auf Länge 0 usw.

Ich habe mal vor Jahren den Fehler gemacht mich bei genau dieser Funktion auf eine Diskussion einzulassen, die von der anderen Seite vereinfacht ausgedrückt so lautete: deine Funktion ist falsch, auch wenn sie aus der OH geradezu abgetippt ist. Auch wenn es in der OH so steht ist es ganz anders gemeint. Denn wenn man deine Funktion nimmt und der Anton ein Bier trinkt, dann könnte das passieren. Also studiere vorher die API wie es gemeint ist usw.

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. :?

DeddyH 15. Mär 2012 15:37

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.

Popov 15. Mär 2012 15:52

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.

Luckie 15. Mär 2012 16:00

AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
 
Auch die Leute von Borland waren nicht unfehlbar.

DeddyH 15. Mär 2012 16:01

AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
 
Delphi-Quellcode:
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;
Ein paar klitzkleine Änderungen, und das wird viel stabiler. Aber bitte, Du musst das ja nicht übernehmen.

p80286 15. Mär 2012 16:39

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

DeddyH 15. Mär 2012 16:45

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.

p80286 15. Mär 2012 16:49

AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
 
Zitat:

Zitat von DeddyH (Beitrag 1156764)
Brauche ich nicht, das erledigt IncludeTrailingPathDelimiter von ganz alleine ;).

Gut zu wissen! Danke

Gruß
K-H

Popov 15. Mär 2012 17:33

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:
  if FindFirst(Path + '*' + Ext, Attrib, Search) = 0 then
    try
      repeat
        List.Add(Path + Search.Name);
      until FindNext(Search) <> 0;
    finally
      FindClose(Search);
    end;
So wie es ist wird FindClose bei einem leeren Ordner nicht ausgeführt. Oder irre ich mich da?

DeddyH 15. Mär 2012 17:36

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?

Popov 15. Mär 2012 20:00

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.

Luckie 15. Mär 2012 20:24

AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
 
Nur dass WinAPI Funktionen keine Delphi Exceptions auslösen.

Popov 15. Mär 2012 20:41

AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
 
Es geht nicht um Exceptions. if FindFirst(...) = 0 then kein Fehler else Fehler.

Luckie 15. Mär 2012 20:56

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?

Popov 15. Mär 2012 20:58

AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
 
In welchem?

DeddyH 16. Mär 2012 07:20

AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
 
Zitat:

SysUtils.FindClose
Gibt den mit FindFirst zugewiesenen Speicher frei.
So, und das passiert eben nicht, wenn z.B. beim "List.Add" eine Exception auftritt (Liste ist nil oder was weiß ich), wenn man auf den try-finally-Block verzichtet. Ist FindFirst <> 0, wird ja gar kein Speicher belegt, da ist FindClose also überflüssig (schadet aber auch nicht). Im Übrigen halte ich mich aus einer weiteren Diskussion ab sofort heraus, da sie in meinen Augen sinnlos ist.

t0mmy 16. Mär 2012 10:58

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.

DeddyH 16. Mär 2012 11:02

AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
 
Redest Du jetzt von der Komponente? Wie sind die "bestimmten Ordner" denn definiert?

t0mmy 16. Mär 2012 11:59

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.

p80286 16. Mär 2012 12:13

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:
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
Gruß
K-H

t0mmy 16. Mär 2012 12:55

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?

DeddyH 16. Mär 2012 13:07

AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
 
Delphi-Quellcode:
FindFirst(Pfad + 'Test*', faDirectory, SearchRec)
Sollte Verzeichnisse finden, deren Name mit Test beginnt.

t0mmy 16. Mär 2012 13:29

AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
 
Ja das FindFirst geht aber er durchsucht mir nicht die unterverzeichnisse :(

DeddyH 16. Mär 2012 13:37

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.

Bummi 16. Mär 2012 14:23

AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
 
http://ww.delphifaq.com/faq/f98.shtml

Popov 16. Mär 2012 14:25

AW: Bestimmte Dateien und Verzeichnise in einem Stammverzeichnis löschen
 
Zitat:

Zitat von t0mmy (Beitrag 1156902)
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?

Hier eine komplexere Funktion, die auch Ordner rekursiv durchsucht. Auch die Funktion habe ich für dich etwas gekürzt. Sollte es irgendwo einen Fehler geben, dann liegt es an der Kürzung.

Solltest du nur Ordner suchen, dann guck in der zweiten Hälfte wie nach Ordnern gesucht wird.

Delphi-Quellcode:
//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;
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.


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