Как удалить папку в корзину - PullRequest
2 голосов
/ 10 августа 2009

Я программирую на 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 \"

Ответы [ 3 ]

3 голосов
/ 10 августа 2009

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

0 голосов
/ 26 марта 2019

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

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

0 голосов
/ 10 августа 2009

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

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

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

...