Pergunta

Estou programando em C ++, MFC, janelas.

Eu quero excluir uma pasta em lixeira. Como posso fazer isso?

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

Qualquer coisa errada com o código acima? É sempre falhou.

Eu encontrei o problema: filePath deve ser: "c: \ abc" não "c: \ abc \"

Foi útil?

Solução

O valor de retorno de SHFileOperation é um int, e deve especificar o código de erro. O que você ganha?

Outras dicas

Eu sei que não é o caminho certo, mas se você não pode encontrar uma solução você pode tentar este ..

nircmd.exe arquivo de download ou de outra exe que pode esvaziar lixeira.

então você chamar essas funções pelo sistema ( "emptybin nircmd.exe")

Você encontrou uma solução que funciona, no entanto, é apenas por acidente. O problema real aqui é que o parâmetro pFrom está em um formato especial. De acordo com a documentação do MSDN para SHFILEOPTS , ele armazena uma lista de caminhos de arquivo, cada uma terminada com nulo, e um nulo extra após a última.

No seu caso isso acontece ao trabalho porque a matriz FromBuf é maior do que o nome do arquivo e todas as entradas são inicializados a zero. A solução mais geral é criar um buffer que é tempo suficiente para que o nome do arquivo e, em seguida, adicionar dois personagens nul depois. Note que nomes de arquivos do Windows pode ter mais de _MAX_PATH, por exemplo, ver https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file#maximum-path-length-limitation

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top