我曾经得到正确的Win32Exception,但现在很奇怪
Win32Exception ex1 = new Win32Exception();
MoveFileWithProgress(oldFile, newFile, new CopyProgressRoutine(this.CopyProgressHandler), IntPtr.Zero, MoveFileFlags.MOVE_FILE_REPLACE_EXISTSING | MoveFileFlags.MOVE_FILE_WRITE_THROUGH | MoveFileFlags.MOVE_FILE_COPY_ALLOWED);
Win32Exception ex2 = new Win32Exception();
获取
ex1:系统找不到指定的文件
ex2:系统可以 找不到输入的环境选项
即使文件存在且操作成功。
其他信息:
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern bool MoveFileWithProgress(string lpExistingFileName,
string lpNewFileName, CopyProgressRoutine lpProgressRoutine,
IntPtr lpData, MoveFileFlags dwFlags);
答案 0 :(得分:1)
您需要检查对MoveFileWithProgress
的调用的返回值。仅当它返回false
时,该功能才会失败。
如果功能失败,您只能致电Marshal.GetLastWin32Error
或创建新的Win32Exception
。像这样:
if (!MoveFileWithProgress(...))
throw new Win32Exception();
如果在成功调用函数后询问最后一个错误,则可以获得适用于早期函数调用失败的错误代码。基本上,在API调用成功的情况下,最后一个错误代码是不明确的。文档非常谨慎,只是告诉您在发生故障时致电GetLastError
。
同样的原则适用于大多数Win32函数,但有时会出现此标准模式的例外情况。例如,注册表函数直接返回Win32错误代码。请务必仔细阅读文档。