确定MoveFileWithProgress是否成功

本文关键字:成功 是否 MoveFileWithProgress 确定 | 更新日期: 2023-09-27 17:51:07

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

确定MoveFileWithProgress是否成功

需要检查调用MoveFileWithProgress的返回值。只有当它返回false时,函数才会失败。

您必须只调用Marshal.GetLastWin32Error或创建一个新的Win32Exception,如果函数失败。这样的:

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

如果你在函数调用成功后查询最后一个错误,你可以得到一个错误代码,这个错误代码适用于之前失败的函数调用。基本上,在API调用成功的情况下,最后一个错误代码定义不清。文档非常小心地只告诉您在失败的情况下调用GetLastError

同样的原则适用于大多数Win32函数,但有时这个标准模式也有例外。例如,注册表函数直接返回Win32错误码。一定要仔细阅读文档。