Ordner löschen, obwohl Programm noch läuft
-
Hallo zusammen,
ich habe ein kleines Problem.
Folgendes: Mein Programm läuft grundsätzlich dauerhaft, sprich es wird - wenn überhaupt - selten geschlossen. Ich habe eine Automatik eingerichtet, die Zip-Dateien herunterlädt und diese in einen temporären Ordner entpackt. Diese Zip-Dateien sind immer gleichen Inhalts.
Nach dem Entpacken kopiere ich den kompletten Inhalt des temporären Ordners, in den entpackt wurde, in einen bestimmten anderen Ordner.Nun zum Problem: Ich möchte den Inhalt des temporären Ordners komplett löschen, also Verzeichnisse und Dateien. Dateien sind kein Problem, nur das mit den Ordnern klappt nicht so wirklich.
Ich benutze den Befehl RemoveDirectory() aus der WinAPI, der auch korrekt ausgeführt wird. Problem ist nur, dass die Ordner nicht sofort gelöscht werden, sondern stehen bleiben, bis das Programm an sich geschlossen wird. Erst dann verschwinden sie. Das ist insofern problematisch, weil die Ordner eigentlich weg sind (Zugriff verweigert), jedoch irgendwie immer noch da sind. D.h. der nächste Entpackvorgang schlägt fehl, weil die Ordner nicht neu erzeugt werden können o.Ä.
Ich hoffe, die Beschreibung der Lage war ok und jemand hat einen Vorschlag, wie man das unkompliziert lösen könnte
Ich bedanke mich schon mal herzlichst im Voraus.
-
Versuch' mal das "current directory" vor dem Löschen zu ändern, z.B. einfach auf das Verzeichnis in dem dein Programm liegt.
-
hustbaer schrieb:
Versuch' mal das "current directory" vor dem Löschen zu ändern, z.B. einfach auf das Verzeichnis in dem dein Programm liegt.
Danke für die schnelle Antwort
Habe direkt vor dem RemoveDirectory() ein SetCurrentDirectory("C:\\Download") gesetzt. Leider ohne Erfolg
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ist
C:\Download
das Verzeichnis das du löschen willst?
Wenn ja: du musstSetCurrentDirectory
auf ein anderes Verzeichnis machen! z.B. einfachSetCurrentDirectory("C:\\")
.
-
hustbaer schrieb:
Ist
C:\Download
das Verzeichnis das du löschen willst?
Wenn ja: du musstSetCurrentDirectory
auf ein anderes Verzeichnis machen! z.B. einfachSetCurrentDirectory("C:\\")
.Nein, löschen möchte ich C:\Temp in diesem Fall.
C:\Download ist dauerhaft da.
-
Vielleicht hast Du noch irgendwo Referenzen auf den Ordner? Aus der MSDN:
"Remarks
The RemoveDirectory function marks a directory for deletion on close. Therefore, the directory is not removed until the last handle to the directory is closed.
To recursively delete the files in a directory, use the SHFileOperation function."
-
Belli schrieb:
Vielleicht hast Du noch irgendwo Referenzen auf den Ordner? Aus der MSDN:
"Remarks
The RemoveDirectory function marks a directory for deletion on close. Therefore, the directory is not removed until the last handle to the directory is closed.
To recursively delete the files in a directory, use the SHFileOperation function."
Ja, das habe ich auch gelesen.
Ich suche halt mit FindFirstFile()/FindNextFile() und will dann mit RemoveDirectory() löschen.Ich habe jetzt irgendwo beim Recherchieren auf englischen Seiten aufgeschnappt, dass RemoveDirectory() wohl selbst ein Handle auf das Verzeichnis anlegt und ich mal SHFileOperation probieren sollte.
-
Machst du nach
FindFirstFile
einFindClose
?
Und falls duCreateProcess
verwendest um irgendwelche Prozesse zu starten, gibst du die beiden Handles die vonCreateProcess
zurückgegeben werden mitCloseHandle
frei?
-
Man könnte das Verzeichnis vor dem Löschen auch umbenennen oder verschieben, um Konflikte grundsätzlich zu vermeiden.
-
Bei einem Problem wie diesem, wo man davon ausgehen kann dass es 100% lösbar ist, würde ich erstmal versuchen das eigentliche Problem zu suchen und zu fixen. Statt irgendwelche Workarounds zu bauen, die dann doch bloss einen Programmierfehler an anderer Stelle maskieren.
-
hustbaer schrieb:
Machst du nach
FindFirstFile
einFindClose
?
Und falls duCreateProcess
verwendest um irgendwelche Prozesse zu starten, gibst du die beiden Handles die vonCreateProcess
zurückgegeben werden mitCloseHandle
frei?Hier mal der ungefähre Code, den ich so auch in Wirklichkeit auf dem Rechner in der Arbeit benutze (sorry für komischen Code, habe lange nicht mehr so daheim programmiert per Visual Studio ):
#include <iostream> #include <conio.h> #include <Windows.h> #include <string> using namespace std; int main(void) { wstring searchfolder(L"C:\\Temp\\*"); wstring tempfolder(L"C:\\Temp\\"); WIN32_FIND_DATA FindFileData; HANDLE hFind; wstring bla = tempfolder + (L"bla"); CreateDirectory(bla.c_str(), NULL); hFind = FindFirstFile(searchfolder.c_str(), &FindFileData); while (hFind != INVALID_HANDLE_VALUE) { if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) { wstring dirname(FindFileData.cFileName); if (dirname != L"." && dirname != L"..") { wstring deldir = tempfolder + dirname; RemoveDirectory(deldir.c_str()); } } if (!FindNextFile(hFind, &FindFileData)) { FindClose(hFind); hFind = INVALID_HANDLE_VALUE; } } _getch(); return 0; }
Ich lege hier also den Ordner C:\Temp\bla erst selbst an, suche ihn dann sozusagen und lösche ihn wieder. Daheim funktioniert das alles.
Unterschied zur Arbeit ist, dass das natürlich alles in einer viel größeren Umgebung läuft, deshalb muss ich erst schauen, ob CreateProcess und CloseHandle verwendet werden. Wie man oben sieht, verwende ich FindClose erst wenn keine Dateien/Ordner mehr gefunden werden, was wie gesagt hier daheim auch so funktioniert.
Was ich mir auch noch vorstellen könnte ist, dass die Zip-Funktion, welche die Ordner entpackt, noch irgendwie die Hand drauf hat.
Kann man das irgendwie herausfinden? Unlocker für Windows z.B. zeigt mir nur an, dass die EXE noch die Hand drauf hat, aber nicht genau was darinWas auch komisch ist: Wenn ich mich recht erinnere, kann ich beim Debuggen vor der Stelle mit FindFirstFile den Ordner über den Explorer löschen glaube ich.
Falls das noch irgendwie hilft. Das würde aber wohl die Theorie mit der Zip-Funktion relativieren.
-
Wenn der von dir gezeigte Code funktioniert, der in der Arbeit aber nicht ... dann ist der von dir gezeigte Code leider total uninteressant.
-
[Unbeabsichtigter Doppelpost]
-
Du könntest auch eine batch erstellen die das Löschen übernimmt.
minimaler aufwand...
http://www.drwindows.de/windows-7-allgemein/32056-geloest-ordner-per-batch-datei-cmd-loeschen.html
den Code einfach als String mit fopen() in eine .bat spechern, ausführen..
solltest dann noch das Verzeichnis natürlich mit in die bat einbringen.