3

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

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

我完全没有想法...

4

2 回答 2

3

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

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

  2. 这些错误代码(返回值)确实,可以并且随着时间的推移而改变,要确定您的特定错误代码是什么意思,您需要使用GetLastError 函数(msdn)检查它

  3. 此外,取自SHFileOperation 函数文档:“如果您不检查 fAnyOperationsAborted 以及返回值,则您无法知道该函数完成了您要求它完成的全部任务,您可能会在不正确的假设下继续进行。”

  4. 您不应该将此 API 用于极长的路径名,它已在 vista+ 中被IFileOperation 接口替换

  5. 为什么它可以在资源管理器中工作而不是通过这个LEGACY api 的解释是——取自关于命名文件、路径和命名空间的 msdn 页面

shell 和文件系统有不同的要求。可以使用 shell 用户界面无法正确解释的 Windows API 创建路径。

希望这有帮助

于 2012-10-10T22:05:03.010 回答
0

回收站不支持路径长度超过 MAX_PATH 的文件。您可以通过尝试在资源管理器中回收此类文件来自己验证这一点 - 您将收到有关路径太长的错误消息。

于 2012-08-28T08:21:29.923 回答