gpt4 book ai didi

windows - SHFileOperation FOF_ALLOWUNDO 对长文件名失败

转载 作者:可可西里 更新时间:2023-11-01 09:25:35 31 4
gpt4 key购买 nike

我正在使用以下函数将文件删除到回收站:(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。

但是怎么了?我检查了一切一百万次。路径以双空结尾,我没有使用\\?\并且它适用于短文件名。

我完全没有想法......

最佳答案

我认为向后可比性以多种方式困扰着您,我需要实际查看您使用的路径并实现一些错误检查代码来提供帮助。但这里有一些提示。

  1. 您不会得到 DE_INVALIDFILES 0x7C“源或目标或两者中的路径无效。”对于最大路径违规,您会得到 DE_PATHTOODEEP 0x79“源路径或目标路径超过或将超过 MAX_PATH。”

  2. 这些错误代码(返回值)会随着时间的推移发生变化,可以发生变化,为了确定您的特定错误代码的含义,您需要使用 GetLastError function(msdn) 进行检查。

  3. 另外,取自 SHFileOperation function documentation :“如果您不检查 fAnyOperationsAborted 以及返回值,您就无法知道该函数是否完成了您要求它完成的全部任务,并且您可能会在错误的假设下继续进行。”

  4. 您不应该将此 API 用于极长的路径名,它在 vista+ 中已被 IFileOperation interface 取代

  5. 为什么它可以在资源管理器中工作而不是通过这个 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com