So löschen Sie Ordner in den Papierkorb
-
12-09-2019 - |
Frage
Ich bin Programmierung unter C ++, MFC, Fenster.
Ich möchte einen Ordner in den Papierkorb löschen. Wie kann ich das tun?
CString filePath = directorytoBeDeletePath;
TCHAR ToBuf[MAX_PATH + 10];
TCHAR FromBuf[MAX_PATH + 10];
ZeroMemory(ToBuf, sizeof(ToBuf));
ZeroMemory(FromBuf, sizeof(FromBuf));
lstrcpy(FromBuf, filePath);
SHFILEOPSTRUCT FileOp;
FileOp.hwnd = NULL
FileOp.wFunc=FO_DELETE;
FileOp.pFrom=FromBuf;
FileOp.pTo = NULL;
FileOp.fFlags=FOF_ALLOWUNDO|FOF_NOCONFIRMATION;
FileOp.hNameMappings=NULL;
bRet=SHFileOperation(&FileOp);
Jede Sache falsch mit dem Code oben? Er scheiterte immer.
fand ich das Problem: filePath sollte sein: "c: \ abc" nicht "c: \ abc \"
Lösung
Der Rückgabewert von SHFileOperation ist ein int, und soll den Fehlercode angeben. Was bekommen Sie?
Andere Tipps
Ich weiß es nicht der richtige Weg ist, aber wenn man eine Lösung finden können Sie versuchen, diese ..
Download-Datei nircmd.exe oder eine andere exe, das Papierkorb leeren kann.
dann rufen Sie diese Funktionen durch das System ( "nircmd.exe emptybin")
Sie haben eine Lösung gefunden, aber es ist nur durch Zufall funktioniert. Das eigentliche Problem hier ist, dass der pFrom
Parameter in einem speziellen Format ist. Nach Ansicht der MSDN-Dokumentation für SHFILEOPTS es eine Liste der Dateipfade gespeichert werden, die jeweils eine null-terminiert und eine zusätzliche null nach dem letzten.
In Ihrem Fall geschieht dies funktioniert, weil die FromBuf
Array ist länger als die Dateinamen und alle Einträge werden auf Null initialisiert. Die allgemeine Lösung ist, einen Puffer zu schaffen, die für die Dateinamen lang genug ist, und dann zwei NUL-Zeichen nach hinzufügen. Beachten Sie, dass Windows-Dateinamen können länger als _MAX_PATH
, siehe zB https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file#maximum-path-length-limitation