【问题标题】:Move a file or folder to the RecycleBin/Trash (C++17)将文件或文件夹移动到 RecycleBin/Trash (C++17)
【发布时间】:2022-01-12 09:15:38
【问题描述】:

我正在尝试编写将文件移动到垃圾箱的函数。 例如,当我使用带有 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";

如何调整它以适用于所有文件?

【问题讨论】:

标签: c++ winapi c++17


【解决方案1】:

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

bool recycle_file_folder(std::wstring path) {

    std::wstring widestr = path + std::wstring(1, L'\0');

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

【讨论】:

  • 注意:std::wstring 有一个 operator+ 附加一个 wchar_t,例如:std::wstring widestr = path + L'\0';
  • 使用此功能,我可以成功处理文件,但即使将文件夹移至垃圾箱,我也会在文件夹中收到错误。有什么问题?
【解决方案2】:

带有 unicode 和空格的文件路径

问题不在于空格,而在于非 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,但这是一个更糟糕的解决方案。

【讨论】:

  • OP 的代码也不是 double-null-终止传递给fileOp.pFrom的字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 2021-08-02
相关资源
最近更新 更多