Ordner löschen, obwohl Programm noch läuft
-
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.