将文件或文件夹移动到 RecycleBin/Trash (C++17)

Move a file or folder to the RecycleBin/Trash (C++17)

我正在尝试编写将文件移至回收站的函数。 例如,当我使用带有 unicode 和空格的文件路径时,我无法将它发送到回收站。

...\Yönü Değiştir\Yönü Değiştir Sil.txt

我在论坛上找到了很多例子。 但我无法 运行 正确。

我哪里错了, 你能帮我正确写出函数吗?

我的函数和代码是这样的:

. includes...
.
.
    bool recycle_file_folder(std::string path) {
    
        std::wstring widestr = std::wstring(path.begin(), path.end());
        const wchar_t* widecstr = widestr.c_str();
    
        SHFILEOPSTRUCT fileOp; //#include <Windows.h>;        
        fileOp.hwnd = NULL;       
        fileOp.wFunc = FO_DELETE;        
        fileOp.pFrom = widecstr; /// L"C:\Users\USER000\Documents\Yönü Değiştir\Yönü Değiştir Sil.txt";
        fileOp.pTo = NULL;        
        fileOp.fFlags = FOF_ALLOWUNDO | FOF_NOERRORUI | FOF_NOCONFIRMATION | FOF_SILENT;
        int result = SHFileOperation(&fileOp);
        
        if (result != 0) {
            return false;
        }
        else {
            return true;
        }
    }

int main()
{
   std::filesystem::path p("C:\Users\USER000\Documents\Yönü Değiştir\Yönü Değiştir Sil.txt");

   recycle_file_folder(p.string());

   return 0;
}

现在,当您像这样指定文件时它可以成功运行:

fileOp.pFrom = L"C:\Users\USER000\Documents\Yönü Değiştir\Yönü Değiştir Sil.txt";

我如何使它适用于所有文件?

a file path with unicode and whitespace

问题不在于空格,而是非 ASCII 字符。

std::wstring widestr = std::wstring(path.begin(), path.end());

这不是将某些代码页的字符转换为 UTF-16 的正确方法。 您必须使用此问答中建议的方法:C++ Convert string (or char*) to wstring (or wchar_t*)(忽略 Pietro M 的回答,查看其他答案)

或者,使用 SHFileOperationASHFILEOPSTRUCTA,但这是一个更糟糕的解决方案。

我认为你的 wstring 和 string 之间的转换有问题。请注意,std::filesystem 支持转换为 string 和 wstring 所以让我们稍微重写一下你的代码

bool recycle_file_folder(std::wstring path) {

    std::wstring widestr = path + std::wstring(1, L'[=10=]');

    SHFILEOPSTRUCT fileOp;      
    fileOp.hwnd = NULL;       
    fileOp.wFunc = FO_DELETE;        
    fileOp.pFrom = widestr.c_str();
    fileOp.pTo = NULL;        
    fileOp.fFlags = FOF_ALLOWUNDO | FOF_NOERRORUI | FOF_NOCONFIRMATION | FOF_SILENT;
    int result = SHFileOperation(&fileOp);
    
    if (result != 0) {
        return false;
    }
    else {
        return true;
    }
}

int main()
{
   std::filesystem::path p("C:\Users\USER000\Documents\Yönü Değiştir\Yönü Değiştir Sil.txt");

   recycle_file_folder(p.wstring());

   return 0;
}