Ordner löschen
-
Hiho,
ich muss einen Ordner löschen. Gibts da etwas ähnlich SHCreateDirectory?
Meine sowas wie SHRemoveDirectory?!Vielen Dank
Fruggle
-
SHFileOperation mit FO_DELETE!
-
Hallo Martin,
ich habe es auch mit FO_DELETE versucht, muss ja aber
\. mit angeben. Damit Lösche ich alle Unterordner und
Dateien. Der Hauptordner bleibt jedoch stehen.Struktur:
c:\
|--->Ordner 1
|--->Ordner 2 (LÖSCHEN inkl. Unterordner/Dateien)
|--->Ordner 3Wenn ich nun den Ordner 2 löschen will, jedoch nicht Ordner 1 und Ordner 3,
habe ich dann mit FO-DELETE automatisch schon verloren, oder mache ich nur etwas
falsch?CString killit="c:\\ordner 2"; // geht nicht CString killit="c:\\ordner 2\\*.*"; // geht, aber Ordner selbst bleibt stehen SHFILEOPSTRUCT myFileOp; myFileOp.hwnd = 0; myFileOp.wFunc =FO_DELETE ; myFileOp.pFrom = killit; myFileOp.lpszProgressTitle = "Lösche Daten..."; SHFileOperation(&myFileOp); if(SHFileOperation(&myFileOp) == 0) { MessageBox("gelöscht..."); } else { MessageBox("fehler..."); }
-
An additional NULL character must be appended to the end of the final name to indicate the end of pFrom.
-
Also mal ganz ehrlich bei mir schmiert die Anwendung an dieser Stelle
komplett ab:SHFileOperation(&myFileOp);Da stimmt doch was nicht? Include ist für shellapi gesetzt...
CString killit; killit="c:\\ordner2"; killit+='\0'; SHFILEOPSTRUCT myFileOp; myFileOp.hwnd = 0; myFileOp.wFunc =FO_DELETE ; myFileOp.pFrom = killit; SHFileOperation(&myFileOp); //und..CRASH.. if(SHFileOperation(&myFileOp) == 0) { MessageBox("gelöscht..."); } else { MessageBox("fehler..."); }
-
Gesamte Struktur vorher auf 0 setzen bitte. Die Struktur hat noch mehr Member als Du initialisierst!
SHFILEOPSTRUCT myFileOp; ::ZeroMemory(&myFileOp,sizeof(myFileOp));
-
Ah, Danke. Muss man denn zwingend alle Member der Struktur ansprechen?
Oder ist es nur sinnvoller, damit man "sauber" davor ist, ohne irgendwelche
vormals initialisierten Member versehentlich anzuwenden?
-
Da du ja nicht genau weißt, auf welche Member der Struktur die Funktion dann zugreift, solltest du alle Member initialisieren explizit oder eben mit ZeroMemory o.ä.
-
Ich habe mir ein ZeroMemory grundsätzlich angewöhnt. Auch wenn manche der Member durch Flags gesteuert werden ist es zumindest eine Gewohnheit, die vor Überraschungen schützt.
-
Martin Richter schrieb:
Ich habe mir ein ZeroMemory grundsätzlich angewöhnt. Auch wenn manche der Member durch Flags gesteuert werden ist es zumindest eine Gewohnheit, die vor Überraschungen schützt.
Zwar richtig, aber ich finde, man sollte dieses 'Clean-Up' nur dann einsetzen, wenn es wirklich nötig ist, da es gerade bei größeren Strukturen die Laufzeit doch stark beeinflußt. Wenn Du beispielsweise 95% der Strukturelemente explizit initialisierst, kannst Du die restlichen auch explizit auf 0 setzen. Bei der Verwendung von ZeroMemory (bzw. memset) würden dann alle explizit zugewiesenen Elemente doppelt initialisiert
Langsamere Programmausführung (natürlich abhängig von der Komplexität der Struktur)
.