2014-03-19 80 views
1

我用來獲取正確Win32Exception但現在是奇怪確定是否MoveFileWithProgress成功

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

您需要調用的返回值檢查MoveFileWithProgress。只有在返回false時,該功能纔會失敗。

如果函數失敗,則只能調用Marshal.GetLastWin32Error或創建一個新的Win32Exception。就像這樣:

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

如果一個函數調用成功,你可以得到一個適用於較早的函數調用失敗,沒有一個錯誤代碼後問的最後一個錯誤。基本上,在API調用成功的情況下,最後的錯誤代碼是不明確的。該文件非常謹慎,只有在出現故障時才通知您致電GetLastError

這一原則適用於大多數Win32函數,但有時會出現這種標準模式的例外情況。例如,註冊表函數直接返回Win32錯誤代碼。請務必仔細閱讀文檔。

+0

謝謝大衛!我在這裏學到了很多東西。 – Daniel

相關問題