Как удалить папку в корзину

Я программирую на C++, MFC, Windows.

Я хочу удалить папку в корзину. Как я могу это сделать?

    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);

Что-то не так с кодом выше? Это всегда не удавалось.

Я обнаружил проблему: filePath должен быть: "c:\abc", а не "c:\abc\"

2 ответа

Решение

Возвращаемое значение из SHFileOperation - int и должно указывать код ошибки. Что вы получаете?

Я знаю, что это не правильный путь, но если вы не можете найти решение, вы можете попробовать это..

Скачайте файл nircmd.exe или другой исполняемый файл, который может очистить корзину.

затем вы вызываете эти функции системой ("nircmd.exe emptybin")

Вы нашли решение, которое работает, но это только случайно. Актуальная проблема здесь в том, что pFrom Параметр в специальном формате. Согласно документам MSDN для SHFILEOPTS, он хранит список путей к файлам, каждый из которых заканчивается на ноль, а дополнительный - после последнего.

В вашем случае это работает, потому что FromBuf массив длиннее имени файла и все записи инициализируются нулями. Более общее решение - создать буфер, который будет достаточно длинным для имени файла, а затем добавить два нулевых символа после него. Обратите внимание, что имена файлов Windows могут быть длиннее, чем _MAX_PATH например, см. https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file

Другие вопросы по тегам