Entwickler-Ecke
Dateizugriff - Das liebe Problem mit dem Löschen von Verzeichnissen
lyrix - Mo 12.12.05 19:52
Titel: Das liebe Problem mit dem Löschen von Verzeichnissen
Hallo, ich weiss das die Frage schon oft genug gestellt worden ist. "Wie löscht man Verzeichnisse"? Es ist dabei egal, ob in dem Verzeichnis was drinsteht oder nicht. Mit RmDir haut es nicht hin, I/O Fehler 103. Warum weiss ich bis heute nicht. Jetzt habe ich mich entschieden, die API-Funktion zu nutzen. Mein Quelltext sieht folgendermaßen aus.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| Function TTManager.DeleteNode(Node : TTreeNode) : Boolean; Var Done : Boolean; newData : PData; FileName, Directory, xStrng : String; sFile : TSHFileOpStruct; Begin DeleteNode:=False; Done:=False; Repeat If Node.getFirstChild <> Nil Then DeleteNode(Node.getFirstChild) Else Begin Done:=True; newData:=Node.Data; If newData.Data = dUser Then xStrng:='.u' Else If newData.Data = dFolder Then xStrng:='.f' Else xStrng:='.l'; If (newData.Data = dUser) Or (newData.Data = dFolder) Then Begin Directory:=Root + '\' + Path(Node) + Node.Text + xStrng; DeleteFiles(Directory); sFile.Wnd:=$0; sFile.wFunc:=FO_Delete; sFile.pFrom:=PChar(Directory); sFile.pTo:=#0#0; sFile.fFlags:=FOF_NoConfirmMKDir Or FOF_Silent Or FOF_NoConfirmation; sFile.hNameMappings:=Nil; sFile.lpszProgressTitle:=Nil; SHFileOperation(sFile); End Else Begin FileName:=Root + '\' + Path(Node) + Node.Text + xStrng; If FileExists(FileName) Then DeleteFile(FileName); End; End; Until Node.getFirstChild = Nil; TreeView.Items.Delete(Node); DeleteNode:=True; End; |
Nun zu meinem Problem. Das Programm löscht die Verzeichnisse aber trotzdem nicht. Es kommt dummerweise auch kein Fehler. Wenn ich "FOF_NoConfirmation" rausnehme fragt mich Windows auch, ob ich die Verzeichnisse wirklich löschen will. Klicke ich dann auf "Ja" wird aber immer noch nichts gelöscht. Was mache ich denn da falsch?
lg Torsten
Moderiert von
Christian S.: Delphi-Tags hinzugefügt.
bockwurst - Di 13.12.05 09:47
Hallo,
mit rmDir kann man nur Verzeichnise löschen die leer sind, sonst kommt eine Fehlermeldung bzw., er macht es nicht. Unter dem guten alten DOS gab es deltree, daß war immer schön. Du mußt dir wohl eine Routine schreiben, die ganz unten im Baum anfängt und dann zuerst alle Dateien im Verzeichnis löscht und dann das Verzeichnis selbst und dann wieder die Dateien im Überverzeichnis und dann das Verzeichnis usw... Dabei muß man dann auf versteckte Dateien / Schreibschutz / gerade in Benutzung usw. aufpassen. Dies ist zwar nicht "schön" aber es funkt.
lyrix - Di 13.12.05 18:22
Genau da besteht das Problem. Genau das funnt nicht. Ich habe es mehrmals mit RmDir versucht. Das Verzeichnis ist leer, keine versteckten Dateien oder sowas. Aus dem Verzeichnis bin ich vorher auch rausgegangen und überprüfe das sogar bevor ich es versuche zu löschen. Das einzige was ich mir vorstellen könnte, das Windows da seine Finger im Spiel hat (mit irgendwelchen Rechte oder sowas). Aber wie ich das überprüfen bzw. verhindern kann weiss ich nicht. Deshalb wollte ich auf die API-Funktion zurück greifen. Ich habe hier im Forum gelesen, das es eine gute Möglichkeit ist. Aber diese Funktion funktioniert bei mir leider nicht. Wie gesagt, die Sicherheitsfrage von Windows kommt, eine Fehlermeldung dagegen nicht. Aber gelöscht wird es trotzdem nicht.
lg lyrix
galagher - Di 13.12.05 21:24
Ich habe irgendwo einmal das hier gefunden, habe aber leider vergessen, zu vermerken, woher und von wem der Sourcecode stammt, was ich sonst immer mache. Dieser Code löscht ganze Ordnerbäume samt allen darin enthaltenen Unterordnern und Dateien, auch schreibgeschützte oder Systemdateien!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| function DelDir(TheDir: String): Boolean; var fos: TSHFileOpStruct; begin if DirectoryExists(TheDir) then begin ZeroMemory(@fos, SizeOf(fos)); with fos do begin wFunc := FO_DELETE; fFlags := FOF_SILENT or FOF_NOCONFIRMATION; pFrom := PChar(TheDir+#0); end;
Result := DirectoryExists(TheDir); if (SHFileOperation(fos) <> 0) then Result := False; end else Result := False; end; |
lyrix - Mi 14.12.05 18:29
Ich danke Euch für Eure Hilfe, ich hab's endlich geschafft.
lg lyrix
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!