确定MoveFileWithProgress是否成功

时间:2014-03-19 16:07:38

标签: c# winapi pinvoke

我曾经得到正确的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);

1 个答案:

答案 0 :(得分:1)

您需要检查对MoveFileWithProgress的调用的返回值。仅当它返回false时,该功能才会失败。

如果功能失败,您只能致电Marshal.GetLastWin32Error或创建新的Win32Exception。像这样:

if (!MoveFileWithProgress(...))
    throw new Win32Exception();

如果在成功调用函数后询问最后一个错误,则可以获得适用于早期函数调用失败的错误代码。基本上,在API调用成功的情况下,最后一个错误代码是不明确的。文档非常谨慎,只是告诉您在发生故障时致电GetLastError

同样的原则适用于大多数Win32函数,但有时会出现此标准模式的例外情况。例如,注册表函数直接返回Win32错误代码。请务必仔细阅读文档。