Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme beim Löschen eines Ordners (https://www.delphipraxis.net/33894-probleme-beim-loeschen-eines-ordners.html)

Helmi 14. Nov 2004 13:08


Probleme beim Löschen eines Ordners
 
Hallo,

ich brauch dringenst eure Hilfe. Ich renn dauernd gegen die Wand :wall: :wall: :wall:

Ich will mit "deleteDir" einen Ordner löschen.

Das geht auch, aber nur wenn der Ordner nie einen Inhalt hatte.

Wenn der Ordner zuvor einen Inhalt hatte (bei mir nur immer eine Datei - die ich vor dem Löschen des Ordners gelöscht hab), dann gibt mir deleteDir immer ein false zurück.

Über FindFirst, FindNext hab ich mal diesen Ordner durchsuchen lassen und hab rausgefunden, dass folgende "Dateien" noch im Ordner vorhanden sind: ".", ".." und "thumbs.db".

Wenn ich aber in den Windows-Explorer schau, dann sagt der dass der ordner leer ist (0 Elemente).

Wie kann ich also diesen Ordner löschen?

hier mal ein wenig Code (aus meinem Test-Programm):

Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
  CheckBox1.Checked := RemoveDir(Edit1.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  CheckBox2.Checked  := deleteFile(Edit2.Text);
  Button1.Enabled := CheckBox2.Checked;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  sr: TSearchRec;
  FileAttrs: Integer;

begin
  FileAttrs := 0;

  FileAttrs := FileAttrs + faHidden;
  FileAttrs := FileAttrs + faSysFile;
  FileAttrs := FileAttrs + faVolumeID;
  FileAttrs := FileAttrs + faDirectory;
  FileAttrs := FileAttrs + faArchive;
  FileAttrs := FileAttrs + faAnyFile;

  If FindFirst(Edit1.Text + '\*.*', FileAttrs, sr) = 0 then
    begin
      repeat
        if (sr.Attr and FileAttrs) = sr.Attr then
        begin
          showmessage(sr.Name);
          showmessage(IntToStr(ord(deletefile(sr.Name))));
        end;
      until FindNext(sr) <> 0;
      FindClose(sr);
    end;
end;
Button1 ist enabled = false
CheckBox1 und 2 dienen nur als anzeige ob true oder falsch

ach ja, thumbs.db lässt sich nicht löschen (siehe repeat-schleife)

mfg
Helmi

alcaeus 14. Nov 2004 13:11

Re: Probleme beim Löschen eines Ordners
 
Hi Helmi,

lass dir mal im Windows Explorer auch versteckte Dateien anzeigen, dann siehst du auch die Thumbs.db. Versuch anschließend, diese manuell zu löschen und anschließend den Ordner von deinem Programm aus zu löschen.

Greetz
alcaeus

Helmi 14. Nov 2004 13:12

Re: Probleme beim Löschen eines Ordners
 
hallo

ich hab mir im win-explorer auch die versteckten dateien anzeigen lassen und eigenartigerweise war thumbs.db auch nicht zum sehen

alcaeus 14. Nov 2004 13:14

Re: Probleme beim Löschen eines Ordners
 
Hi Helmi,

es könnte sein dass die Datei auch als Systemdatei eingestellt ist. Dies musst du auch in den Ordneroptionen einstellen. Bei mir wird die Datei jedenfalls angezeigt.

Greetz
alcaeus

Helmi 14. Nov 2004 13:22

Re: Probleme beim Löschen eines Ordners
 
ich hab jetzt meinen fehler gefunden warum ich die thumbs.db nicht löschen konnte

hier der "verbesserte Code":
Code:
procedure TForm1.Button3Click(Sender: TObject);
var
  sr: TSearchRec;
  FileAttrs: Integer;

begin
  FileAttrs := 0;

  FileAttrs := FileAttrs + faHidden;
  FileAttrs := FileAttrs + faSysFile;
  FileAttrs := FileAttrs + faVolumeID;
  FileAttrs := FileAttrs + faDirectory;
  FileAttrs := FileAttrs + faArchive;
  FileAttrs := FileAttrs + faAnyFile;

  If FindFirst(Edit1.Text + '\*.*', FileAttrs, sr) = 0 then
    begin
      repeat
        if (sr.Attr and FileAttrs) = sr.Attr then
        begin
          showmessage(sr.Name);
          showmessage(IntToStr(ord(deletefile(Edit1.Text + '\' + sr.Name))));
        end;
      until FindNext(sr) <> 0;
      FindClose(sr);
    end;
end;
Jetzt ist zwar der Ordner bis auf "." und ".." leer, aber löschen kann ich ihn immer noch nicht

:wall: :wall: :wall:

Dax 14. Nov 2004 13:24

Re: Probleme beim Löschen eines Ordners
 
Das ist kein Wunder: . und .. sind virtuelle Ordner, die ins übergeordnete bzw. ins eigene Verzeichnis verweisen. Die zu löschen ist unmöglich, da sie nicht existieren.

Helmi 14. Nov 2004 13:27

Re: Probleme beim Löschen eines Ordners
 
na aber dann ist die procedure deleteDir vollkommen nutzlos wenn man einen leeren Ordner nie löschen kann wegen den "." und ".."

oder gibts ne ne möglichkeit?

Dax 14. Nov 2004 13:29

Re: Probleme beim Löschen eines Ordners
 
Wie gesagt, "." und ".." sind nur logische Links, wenn ausser denen im Verzeichnis nichts existiert, muss es löschbar sein.

Helmi 14. Nov 2004 13:30

Re: Probleme beim Löschen eines Ordners
 
leider nein - oder ich mach was falsch

Christian Seehase 14. Nov 2004 13:33

Re: Probleme beim Löschen eines Ordners
 
Moin Helmi,

Angaben wie die Attribute sollte man nicht mit + verknüpfen sondern mit OR, also statt

Delphi-Quellcode:
  FileAttrs := FileAttrs + faHidden;
  FileAttrs := FileAttrs + faSysFile;
  // usw.
solltest Du

Delphi-Quellcode:
  FileAttrs := FileAttrs or faHidden;
  FileAttrs := FileAttrs or faSysFile;
  // usw.
verwenden.
Wenn Du mal nach Hier im Forum suchenfaAnyFile suchst solltest Du dazu einen recht aktuellen Thread mit einer näheren Erklärung finden.

Um herauszubekommen warum Du den Ordner nicht löschen kannst, solltest Du Dir mal die Ursache anzeigen lassen.
Nach dem fehlgeschlagenen Löschversuch einfach mal
Delphi-Quellcode:
ShowMessage(SysErrorMessage(GetLastError));

Helmi 14. Nov 2004 14:04

Re: Probleme beim Löschen eines Ordners
 
Danke Christian Seehase :hello: :cheers: :cheers: :hello:

dein Tip hat geholfen :-D

Ich hab meinen Button 3 wie folgt umgeändert und dann kann ich mit dem Button2 den order ohne probs ändern:

Code:
procedure TForm1.Button3Click(Sender: TObject);
var
  sr: TSearchRec;
  FileAttrs: Integer;

begin
  FileAttrs := 0;

  FileAttrs := FileAttrs or faReadOnly;
  FileAttrs := FileAttrs or faHidden;
  FileAttrs := FileAttrs or faSysFile;
  FileAttrs := FileAttrs or faVolumeID;
  FileAttrs := FileAttrs or faDirectory;
  FileAttrs := FileAttrs or faArchive;
  FileAttrs := FileAttrs or faAnyFile;

  If FindFirst(Edit1.Text + '\*.*', FileAttrs, sr) = 0 then
    begin
      repeat
        if (sr.Attr and FileAttrs) = sr.Attr then
        begin
          showmessage(sr.Name);
          showmessage(IntToStr(ord(deletefile(Edit1.Text + '\' + sr.Name))));
        end;
      until FindNext(sr) <> 0;
      FindClose(sr);
    end;
end;

Christian Seehase 14. Nov 2004 14:09

Re: Probleme beim Löschen eines Ordners
 
Moin Helmi,

freut mich. :-D

Ich möchte Dir aber empfehlen Dir auch den Beitrag zu Gemüte zu führen, warum das so geht, denn das Verknüpfen von Flags kommt an vielen Stellen vor.

Helmi 14. Nov 2004 14:13

Re: Probleme beim Löschen eines Ordners
 
Okili Dokili :-)

werd ich bei Gelegenheit tun - zuerst muss ich an meiner function weitertippen

:coder:

mfg
Helmi


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