Entwickler-Ecke
Dateizugriff - Ordener "mit Inhalt" löschen
Smilebey - So 18.09.05 18:33
Titel: Ordener "mit Inhalt" löschen
Hallo.Also würde gerne wissen wie man einen Ordner löscht der nicht leer ist.
Denn ich habe folgenedes im Delphi Help gefunden:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| The RemoveDirectory function deletes an existing empty directory.
BOOL RemoveDirectory(
LPCTSTR lpPathName // address of directory to remove );
Parameters
lpPathName
Points to a null-terminated string that specifies the path of the directory to be removed. The path must specify an empty directory, and the calling process must have delete access to the directory.
Return Values
If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError. |
Wie man sieht kan man diese Finktion nutzem um leere Ordner zu löschen.
Da müsste man zu erst alle Dateien u Unterordner löschen.
Aber wie??
Danke im Vorraus!!!
Moderiert von
raziel: Topic aus Windows API verschoben am Fr 18.11.2005 um 07:24
maxk - So 18.09.05 19:40
Hallo,
ich habe das mal so gelöst:
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:
| function RemoveDirectories(Dir:string):boolean; var SR:TSearchRec; Continue:boolean; begin Result:=False; Dir:=BackSlash(Dir); Continue:=FindFirst(Dir+'*.*',faAnyFile,SR)=0; while Continue do try if (SR.Name='.') or (SR.Name='..') then System.Continue; if not DirectoryExists(Dir+SR.Name) then begin SetFileAttributes(PChar(Dir+SR.Name),FILE_ATTRIBUTE_NORMAL); DeleteFile(Dir+SR.Name); end else RemoveDirectories(Dir+SR.Name); finally Continue:=FindNext(SR)=0; end; FindClose(SR);
SetFileAttributes(PChar(Dir),FILE_ATTRIBUTE_NORMAL); Delete(Dir,length(Dir),1); if length(Dir)>0 then Result:=RemoveDir(Dir); end; |
Diese Funktion sucht im Verzeichnis nach Dateien, ändert die Attribute und löscht dann die Datei. Wird ein anderes Verzeichnis gefunden, so wird für dieses die Funktion ebenfalls aufgerufen (Rekursion) und anschließend gelöscht.
Gruß,
maxk
Smilebey - Mi 21.09.05 15:50
Rekursion ist hier die Lösung nur funzt bei mir diese function nicht.Löscht nur die Dateien im Ordner, aber nicht die Unterordner und die Dateien der Unterordner.Liegt es daran das ich die BackSlash function nicht mitgeschrieben habe(weil ich nicht weiß was ich in uses für diese func schreiben muss)?Ich glaube aber dass das das Problem nicht ist.
Was mach ich???
maxk - Mi 21.09.05 16:51
Es gibt Fehler, die müssen einem so richtig weh tun. Dieser tut mir weh, da ich zugeben muss die Funktion auf einem alten Programm kopiert zu haben. Die Funktion Backslash habe ich aber vergessen. Diese macht eigentlich nichts anders, als an den Pathnamen einen Backslash anzuhängen:
Delphi-Quelltext
1: 2: 3: 4:
| function Backslash(const Dir:string):string; begin if copy(Dir, length(Dir), 1) <> '\' then Result:=Dir+'\' else Result:=Dir; end; |
Ohne den Aufruf wird zwischen Verzeichnisname und Dateiname nichts eingefügt. Aus Test\Datei.txt wird TestDatei.txt, was (natürlich) nicht gelöcht werden kann.
Gruß,
maxk
flieger-michl - Do 22.09.05 15:49
Hallo,
Eine Alternative zum rekursiven löschen wäre die Funktion Unit ShellAPI, Das hätte den Vorteil, daß der gelöschte Goulasch wahlweise sogar in den Papierkorb wandert.
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:
| Program KillDir; uses Dialogs, ShellAPI;
procedure DoRemoveDir(Dir : string); var sh : TSHFileOpStruct; begin if Dir <> '' then if Dir[Length(Dir)] = '\' then system.delete(Dir, Length(Dir), 1); sh.Wnd := 0; sh.wFunc := FO_DELETE; sh.pFrom := PChar(Dir + #0#0); sh.pTo := #0#0; sh.fFlags := FOF_NOERRORUI or FOF_NOCONFIRMMKDIR or FOF_SILENT or FOF_NOCONFIRMATION; sh.hNameMappings := NIL; sh.lpszProgressTitle := NIL; SHFileOperation(sh); end;
var Dir : String;
begin Dir := 'C:\Windows'; if InputQuery('Welches Verzeichnis darf ich denn löschen?', 'Zu löschendes Verzeichnis', Dir) then DoRemoveDir(Dir); end. |
Moderiert von
raziel: Delphi-Tags hinzugefügt.
Miri - Mo 14.11.05 10:52
Hallo,
hab das mit der Funktion von maxk versucht, das Löschen funktioniert auch.
Jetzt verwende ich aber in der gleichen Prozedur, auch ForceDirectories um den Ordner neu zu erstellen. Noch etwas später soll eine Datei in diesen neuerstellten Ordner kopiert werden. Und genau das funktioniert nicht...
Jemand ne Idee??
Gruß,
Miri
jojo-sp - Mo 14.11.05 11:05
Funktioniert das anlegen der neuen Datei in dem besagten Ordner manuell?
Miri - Mo 14.11.05 11:10
ja
BenBE - Mo 14.11.05 11:26
Gib bitte mal kurz einen Auszug, wie Du die Datei anlegst (+evtl. Source wo der Ordner angelegt wird).
BenBE - Mo 14.11.05 11:34
Konvertier die Pfad-Angabe zum Konverter in Kurze Dateinamen. Dann sollte das eigentlich auch funzen.
Miri - Mo 14.11.05 11:36
Das Problem ist, dass das Programm auch auf anderen Rechnern installiert werden soll. Und installieren kann man grundsätzlich überall hin. Klar kann ich standardmäßig kurze Pfade ohne Leerzeichen verwenden, aber letztendlich ist's jedem freigestellt, wohin er's installiert, und so solls auch bleiben...
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!