我正在使用:
Result := not Boolean(SHFileOperation(lpFileOp));
FOperationAborted := lpFileOp.fAnyOperationsAborted
复制文件,在极少数情况下,文件副本由于某种原因无法完成。我似乎找不到OpAbort以外的返回值和函数的布尔本身。
我尝试使用GetLastError
,但总是为零。
有什么方法可以找出错误是什么? 它可能是磁盘已满,文件名无效,写保护目标,硬件磁盘写入错误或任何其他问题,如果发生错误,我似乎无法弄清楚如何处理错误。
答案 0 :(得分:3)
您需要仔细阅读该功能的documentation。它说:
返回值
输入:int
如果成功则返回零;否则非零。应用正常 应该只检查零或非零。
最好检查fAnyOperationsAborted的值 SHFILEOPSTRUCT的成员。 SHFileOperation可以返回0表示成功 如果用户取消操作。如果你不检查 fAnyOperationsAborted以及返回值,你无法知道 该功能完成了你和它所要求的完整任务 可能会在不正确的假设下进行。
不要将GetLastError与此函数的返回值一起使用。
要检查非零值以进行故障排除,请执行此操作 主要映射到Winerror.h中定义的那些。但是,它的几个 可能的返回值基于Win32之前的错误代码,其中包含 某些情况会重叠后来的Winerror.h值而不匹配它们 含义。这些特定值在此处详细说明 具体值只有这些含义应该被接受 Winerror.h代码。但是,这些值随这些提供 警告:
- 这些是Win32之前的错误代码,不再支持或在任何公共头文件中定义。要使用它们,您必须定义 他们自己或与数值进行比较。
- 这些错误代码可能会发生变化,并且历史上已经这样做了。
- 这些值仅作为调试帮助提供。它们不应被视为决定性的。
.... 表已删除,请参阅documentation ....
因此,简而言之,您必须捕获返回值,这是一个整数。如果返回值不为零,则函数将失败。然后文档告诉您如何将该返回值解释为推断失败原因的方法。请注意,文档清楚地表明这些失败原因并不确定。文档清楚地表明不会调用GetLastError
。
如果报告准确的错误消息很重要,那么您应该使用IFileOperation
代替。其documentation提供了一长串理由,希望将其更改为SHFileOperation
。其中之一是:
通过HRESULT值与FormatMessage等API一起进行更准确的错误报告。 SHFileOperation的返回代码可能会产生误导或不准确。
答案 1 :(得分:0)
由于Windows Vista SHFileOperation已被弃用并被IFileOperation取代。在行之间读取,原始SHFileOperation代码已被丢弃,并且已通过调用IFileOperation重新实现。这似乎有后果。
最重要的是,您看到的错误可能无法解决。绝对检查返回值(根据文档),你可能会很幸运。如果可能的话,考虑切换到IFileOperation,它提供更好的进度报告和错误诊断。