Ordner löschen, obwohl Programm noch läuft



  • 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 musst SetCurrentDirectory auf ein anderes Verzeichnis machen! z.B. einfach SetCurrentDirectory("C:\\") .



  • hustbaer schrieb:

    Ist C:\Download das Verzeichnis das du löschen willst?
    Wenn ja: du musst SetCurrentDirectory auf ein anderes Verzeichnis machen! z.B. einfach SetCurrentDirectory("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 ein FindClose ?
    Und falls du CreateProcess verwendest um irgendwelche Prozesse zu starten, gibst du die beiden Handles die von CreateProcess zurückgegeben werden mit CloseHandle 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 ein FindClose ?
    Und falls du CreateProcess verwendest um irgendwelche Prozesse zu starten, gibst du die beiden Handles die von CreateProcess zurückgegeben werden mit CloseHandle 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 darin 😃

    Was 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.


Anmelden zum Antworten