![]() |
Ordner löschen, auch wenn darauf zugegriffen wird
Hallo Delphifreunde,
ich muss Daten von mehreren Festplatten auf einer zusammenfassen. Um die ganzen doppelten Datei herauszufinden, Dateien umzubenennen usw. habe ich mir viele kleine Helferlei programmiert. Leider benutzen diese fast alle ShellTreeView oder FileListBox. Und wenn ich dann endlich ein doppeltes Verzeichnis gefunden habe und es im Windows-Explorer löschen will bekomme ich nur zur Antwort "Der Ordner BlaBla kann nicht entfernt werden: Die Datei wird von einer anderen Person bzw. einem anderen Programm verwendet. Schließen Sie alle Programme, die die Datei eventuell verwenden können, und wiederholen Sie den Vorgang." Da ich aber keine Lust habe zum Löschen eines dämlichen Ordners sämtliche Helferlei zu schließen (und auch wieder zu öffnen!), nur weil diese irgendwann mal auf das Verzeichnis zugegriffen haben, schreibe ich ein weiteres Helferlei. Das Problem ist allerdings, dass es mir auch mit SHFileOperation und RemoveDir nicht gelingt den Ordner zu löschen. Kennt jemand eine Möglichkeit ein Verzeichnis zu löschen, sch**ßegal wer oder was auch immer darauf zugreift? Gruß eines verzweifelten E-gons |
Re: Ordner löschen, auch wenn darauf zugegriffen wird
Deine Helferlein müssen nur nach dem Auslesen die Datei-/Verzeichnishandles wieder freigeben, dann gibt's da auch keine Probleme mehr :zwinker:
OK, TOpenDialog und Co. halten in einem Thread oftmals einige handles offen, aber dafür hab ich irgendwo noch 'nen "Patch" ... müßte ich mal suchen bzw. es kann ja mal wer die Beiträge zu meinem FileSplitter durchsuchen, ich glaub da hatte ich dieses mal erwähnt. :gruebel: Zitat:
Man kann aber die Handles freigeben, welche von anderen Programmen genutzt werden (Stichwort: Unlocker), oder man sagt Windows, daß es einen Ordner/Datei nach dem nächsten Neustart löschen soll (wo diese ja dann wohl frei sind) |
Re: Ordner löschen, auch wenn darauf zugegriffen wird
Hallo himitsu,
vielen Dank für die schnelle Antwort. Mit Handles kenne ich mich nicht aus, werde aber mal recherchieren... Gruß E-gon |
Re: Ordner löschen, auch wenn darauf zugegriffen wird
Zitat:
"Der Motor verbrennt nicht richtig. Könnte an der Zylinderkopfdichtung liegen." "Ja wissen Sie, mit Zylinderkopfdichtungen kenne ich mich nicht so, aber ich werde mal Recherchieren. Mein Spezialgebiet sind eigentlich Zündkerzen." ;) |
Re: Ordner löschen, auch wenn darauf zugegriffen wird
@Luckie:
Das kann ich jetzt natürlich nicht so stehen lassen. Ich bin eigentlich Spezialist für Datenmigration. Mein einziger Berührungspunkt mit dem "Handle Konzept" ist das Einlesen und Schreiben der Daten. Oder um bei Deinem Beispiel zu bleiben: Ein Karosserieblechner gehört auch zu den Automechanikern. Den brauchen jedoch die Zylinderkopfdichtungen nicht zu interessieren. Und nebenbei gesagt verdient er auch noch besser. ;-) @all: Aber zurück zum Thema. Wie es aussieht habe ich nun zwei Möglichkeiten 1. Meinen Helferlein das Handle unter den Füßen wegziehen oder 2. Bei meinen Helferlein die Verzeichnishandles wieder freigeben Das mit dem Handle Wegziehen ist nicht unbedingt die feine Art. Deshalb würde ich doch eher zweiteres bevorzugen. @himitsu: Könntest Du das mit dem Freigeben von Datei-/Verzeichnishandles bei Dialogsobjekten bitte etwas genauer beschreiben? |
Re: Ordner löschen, auch wenn darauf zugegriffen wird
Um ein geöffnete File von einem anderen Prozess zu löschen, muss man tief ins Betriebssystem einsteigen.
Es gibt einige Tools, die das können, aber wahrscheinlich keinen Sourcecode dafür. ![]() Ich muss mich berichtigen - es gibt Sourcecode: ![]() |
Re: Ordner löschen, auch wenn darauf zugegriffen wird
Danke shmia, aber wie schon gesagt würde ich inzwischen die Möglichkeit bevorzugen bei den Helferlein nach dem Auslesen des Verzeichnisses das Verzeichnishandle einfach wieder freizugeben. Wie auch immer das funktioniert...
|
Re: Ordner löschen, auch wenn darauf zugegriffen wird
Es kommt ja erstmal drauf an, was genau für Komponenten/Funktionen und wie du sie benutzt.
|
Re: Ordner löschen, auch wenn darauf zugegriffen wird
Ok, ich habe jetzt Testweise die FileListBox durch eine einfache ListBox ersetzt (LBFile) und lese das Verzeichnis wie folgt selbst aus:
Delphi-Quellcode:
Obwohl ich FileInfo ordnungsgemäß schließe, lassen sich zwar die Dateien nicht aber der Ordner, in denen sich die Dateien befinden, von anderen Programmen löschen. Was muss ich tun um den ausgelesenen Ordner für andere Programme wieder zum Löschen freizugeben ohne gleich das ganze Programm schließen zu müssen?
procedure TForm1.ReadLBFile(Path: string);
var FileExt: string; FileInfo: TSearchRec; begin LBFile.Clear; if FindFirst(Path+'*.*',0, FileInfo)=0 then begin repeat FileExt:= UpperCase(ExtractFileExt(FileInfo.Name)); if FileExt='.TXT' then LBFile.Items.Add(FileInfo.Name); until FindNext(FileInfo)<>0; FindClose(FileInfo); end; end; |
Re: Ordner löschen, auch wenn darauf zugegriffen wird
Bei der ShellTreeView-Komponente ist es genauso. Einmal ein Verzeichnis selektiert kann man dieses mit einem anderen Programm nicht mehr löschen, selbst wenn im ShellTreeView längst ein anderer Ordner ausgewählt und das zu löschende Verzeichnis noch nicht mal eingeblendet ist.
Deshalb wollte ich schlau sein und habe ShellTreeView durch die Funktion SelectDirectory ersetzt. Aber gleiches Spiel! Die ausgewählten Verzeichnisse lassen sich erst nach dem Beenden des Programms von anderen Programm löschen... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 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