SHFileOperation FOF_ALLOWUNDO在长文件名上失败

我正在使用下面的函数来删除一个文件到回收站:(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); } 

这适用于大多数文件。 但是,如果path+文件名超过了255个字符(仍然比2048个字符短得多),SHFileOperation返回124.这是DE_INVALIDFILES。

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

我完全没有想法…

我认为向后的可比性在几方面让你感到棘手,我需要真正看到你使用的路径,并实现一些错误检查代码来帮助你。 但是这里有一些提示。

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

  2. 这些错误代码(返回值)可以,并且随着时间的推移发生了变化,为了确定您的具体错误代码的含义,您需要使用GetLastError函数(msdn)来检查它,

  3. 另外,从SHFileOperation函数文档中获得 :“如果您没有检查fAnyOperationsAborted以及返回值,则无法知道函数是否完成了您所要求的全部任务,并且您可能会在错误的假设下进行。

  4. 你不应该使用这个API来获取非常长的路径名,它已经被iFileOperation接口在vista +中替换了

  5. 解释为什么它可以在浏览器中工作,而不是通过这个LEGACY API – 从命名文件,路径和命名空间的msdn页面

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

希望这是有帮助的

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