我有一個WinForms應用程序。它被寫入磁盤。我從磁盤運行應用程序並從CD中彈出磁盤。然後我排除:驅動器中沒有磁盤。請將磁盤插入驅動器。我如何捕獲這個異常並正確關閉我的應用程序?WinForms:驅動器中沒有磁盤。請將磁盤插入驅動器
回答
您應該嘗試檢測光盤彈出。這裏是工作示例:publicjoe.f9.co.uk/csharp/snip/snip002.html
您可以修改您的Program.cs是這樣的:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
try
{
Application.Run(new Form1());
}
catch (Exception ex)
{
// Display the exception to the end user.
}
finally
{
// Do your cleanup here.
}
}
這應該捕獲所有異常你沒有趕上,否則在應用程序本身。
這是一個通用的問題,任何種類的程序,不特定於Winforms應用程序。它與創建過程的方式有關。 Windows創建一個所謂的內存映射文件,它將文件中的字節映射到進程的地址空間。這是從文件中讀取數據的一種非常有效的方式,只有在實際需要數據時纔會發生磁盤讀取。當程序執行跳轉到特定的代碼塊時,或者JIT編譯器需要一個方法的IL時,當數據尚未讀取時會產生頁面錯誤。操作系統通過從文件中讀取塊來解決它。您只需支付實際運行的代碼。
另一個主要優勢是當系統處於壓力之下並且需要太多內存來保持進程運行時。內存管理器將頁面從內存中抽出來爲需要CPU的進程騰出空間。這些頁面通常寫入分頁文件。但是當它們來自EXE文件時,這是不必要的。它可以簡單地丟棄它們,並通過重新讀取文件來重新獲取它們。
您可能會看到這會導致:當您彈出磁盤時,從EXE文件加載頁面無法工作了。 Windows注意到這一點,並提出對話框。這是一個非常低級別的錯誤處理機制,您不能將其陷入進程本身。這是行不通的,因爲那需要在程序中執行代碼。無法從磁盤加載的代碼。
您可能可以通過禁止SetErrorMode()來抑制錯誤。不知道,從來沒有嘗試過。但是這並沒有真正解決任何問題,所以可能發生的下一個最好的事情是Windows終止程序時會出現一個模糊的錯誤。唯一合理的解決方案是讓用戶按照Windows的要求放回磁盤,或者從媒體運行安裝程序,以便在硬盤上創建該程序的副本。
使用EDITBIN /SWAPRUN告訴Windows您的可執行文件駐留在可移動設備上。它會在運行之前將其複製到交換文件。
這是您通常爲(例如)安裝程序所做的。我不確定這是否可以工作,如果你依賴於其他的DLL,但我認爲它可以。
對於其他資源,您希望在初始化期間儘快將它們複製到臨時位置。
或者,您可以調用SetErrorMode來禁用消息框並正確處理錯誤。
謝謝!這是一個非常有趣的想法,但我的應用程序有很多外部資源。無論如何,我應該關閉該程序。 – Rover 2010-10-19 11:06:30
夠公平的。更新一些更詳細的信息,以防其他人認爲有用。 – 2010-10-19 12:35:16
- 1. 「將磁盤插入驅動器D」啓動塊Haskell從
- 2. Eclipse Galileo中缺少磁盤驅動器
- 3. Ruby獲取可用磁盤驅動器
- 4. 無驅動器盤符的驅動器的Powershell可用磁盤空間
- 5. PHP錯誤 - 「驅動器中沒有磁盤」
- 6. cygwin/dev/sd *磁盤關聯到硬盤驅動器
- 7. 添加新的磁盤datanode與更大的硬盤驅動器
- 8. 硬盤驅動器磁盤讀取緩存
- 9. 將驅動器號轉換爲分區ID /磁盤ID
- 10. 顯示帶有磁盤空間的驅動器號
- 11. 通過VS 6.0 C++執行CL.EXE導致「驅動器中沒有磁盤.. <損壞的驅動器名稱>
- 12. C++ \ Win32的信息有關的所有驅動器:硬盤驅動器,USB驅動器,光盤驅動器,軟盤驅動器等
- 13. 如何在批處理中避免「驅動器中沒有磁盤」錯誤
- 14. Windows Phone 8上的磁盤篩選器驅動程序
- 15. 閱讀像USB閃存驅動器的iPad/iPhone磁盤
- 16. ApplescriptObjC到磁盤的路徑(主機驅動器)
- 17. 通過WMI讀取磁盤驅動器屬性
- 18. 檢測磁盤是否爲閃存驅動器
- 19. 錯誤地獲取磁盤驅動器信息
- 20. SQL創建程序集時無需訪問磁盤驅動器
- 21. 從充電更改到磁盤驅動器後,UI會崩潰?
- 22. 如何使用python或WMI設置RAM磁盤驅動器?
- 23. 磁盤驅動器是否被視爲數據庫?
- 24. 驅動器盤查看器
- 25. 將USB磁盤BSD名稱映射到OSX中的實際安裝驅動器
- 26. C# - 從硬盤驅動器
- 27. 刪除驅動器盤符
- 28. 確定驅動器中有光盤
- 29. 硬盤或硬盤驅動器
- 30. 在Java中區分CD驅動器和硬盤驅動器
你是什麼意思「正確關閉我的應用程序」?你只是想抓住例外,或者你想執行清理行動? – 2010-10-18 10:46:07
我想要捕獲這個異常並將其替換爲自己的消息(然後可能是關閉應用程序)。 – Rover 2010-10-18 11:19:29