- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用以下函数将文件删除到回收站:(C++、MFC、Unicode)
bool DeleteFileToPaperbasket (CString filename)
{
TCHAR Buffer[2048+4];
_tcsncpy_s (Buffer, 2048+4, filename, 2048);
Buffer[_tcslen(Buffer)+1]=0; //Double-Null-Termination
SHFILEOPSTRUCT s;
s.hwnd = NULL;
s.wFunc = FO_DELETE;
s.pFrom = Buffer;
s.pTo = NULL;
s.fFlags = FOF_ALLOWUNDO | FOF_SILENT | FOF_NOERRORUI;
s.fAnyOperationsAborted = false;
s.hNameMappings = NULL;
s.lpszProgressTitle = NULL;
int rc = SHFileOperation(&s);
return (rc==0);
}
这适用于大多数文件。但是如果路径+文件名超过 255 个字符(并且比 2048 个字符短得多),SHFileOperation 返回 124。这就是 DE_INVALIDFILES。
但是怎么了?我检查了一切一百万次。路径以双空结尾,我没有使用\\?\并且它适用于短文件名。
我完全没有想法......
最佳答案
我认为向后可比性以多种方式困扰着您,我需要实际查看您使用的路径并实现一些错误检查代码来提供帮助。但这里有一些提示。
您不会得到 DE_INVALIDFILES 0x7C“源或目标或两者中的路径无效。”对于最大路径违规,您会得到 DE_PATHTOODEEP 0x79“源路径或目标路径超过或将超过 MAX_PATH。”
这些错误代码(返回值)会随着时间的推移发生变化,可以发生变化,为了确定您的特定错误代码的含义,您需要使用 GetLastError function(msdn) 进行检查。
另外,取自 SHFileOperation function documentation :“如果您不检查 fAnyOperationsAborted 以及返回值,您就无法知道该函数是否完成了您要求它完成的全部任务,并且您可能会在错误的假设下继续进行。”
您不应该将此 API 用于极长的路径名,它在 vista+ 中已被 IFileOperation interface 取代
为什么它可以在资源管理器中工作而不是通过这个 LEGACY api 的解释是 - 摘自 Naming Files, Paths, and Namespaces 上的 msdn 页面
The shell and the file system have different requirements. It is possible to create a path with the Windows API that the shell user interface is not able to interpret properly.
希望对你有帮助
关于windows - SHFileOperation FOF_ALLOWUNDO 对长文件名失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12155094/
我正在使用以下函数将文件删除到回收站:(C++、MFC、Unicode) bool DeleteFileToPaperbasket (CString filename) { TCHAR Buff
我是一名优秀的程序员,十分优秀!