将文件或文件夹移动到 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 的回答,查看其他答案)
或者,使用 SHFileOperationA
和 SHFILEOPSTRUCTA
,但这是一个更糟糕的解决方案。
我认为你的 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;
}
我正在尝试编写将文件移至回收站的函数。 例如,当我使用带有 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 的回答,查看其他答案)
或者,使用 SHFileOperationA
和 SHFILEOPSTRUCTA
,但这是一个更糟糕的解决方案。
我认为你的 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;
}