Autor Beitrag
lyrix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mo 12.12.05 19:52 
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.

ausblenden volle Höhe 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 user profile iconChristian S.: Delphi-Tags hinzugefügt.
bockwurst
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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
wolke
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 240



BeitragVerfasst: Di 13.12.05 18:33 
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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!
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
{Ordner samt Unterordnern und Dateien löschen}
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) <> 0then Result := False;
 end
 else
  Result := False;
end;

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
lyrix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mi 14.12.05 18:29 
Ich danke Euch für Eure Hilfe, ich hab's endlich geschafft.

lg lyrix