WinForms:驱动器中没有磁盘。请将磁盘插入驱动器

时间:2010-10-18 10:36:01

标签: c# .net winforms exception

我有一个WinForms应用程序。它被写入磁盘。我从磁盘运行应用程序并从CD弹出磁盘。然后我采取例外:驱动器中没有磁盘。请将磁盘插入驱动器。如何捕获此异常并正确关闭我的应用程序?

4 个答案:

答案 0 :(得分:4)

你应该尝试检测cd弹出。这是一个工作样本:publicjoe.f9.co.uk/csharp/snip/snip002.html

你也可以看看这个: Detecting Eject/Insert of Removeable Media

答案 1 :(得分:3)

这是任何类型的程序的一般问题,不是特定于Winforms应用程序。它与创建流程的方式有关。 Windows创建了一个所谓的内存映射文件,它将文件中的字节映射到进程的地址空间。这是从文件读取数据的一种非常有效的方法,只有在实际需要数据时才会发生磁盘读取。当程序执行跳转到特定的代码块,或者JIT编译器需要IL作为方法时,在尚未读取数据时会生成页面错误。操作系统通过从文件中读取块来解决它。您只需为实际运行的代码付费。

另一个主要好处是当系统处于压力之下并且需要太多RAM来保持进程运行时。内存管理器从RAM中删除页面,为需要CPU的进程腾出空间。这些页面通常写入页面文件。但是,当它们来自EXE文件时,这是不必要的。它可以简单地丢弃它们,并通过重新读取文件来恢复它们。

您可能会看到这导致的结果:当您弹出磁盘时,从EXE文件加载页面不再有效。 Windows会注意到这一点并显示对话框。这是一个非常低级别的错误处理机制,您无法将其陷入进程本身。这不起作用,因为这需要在程序中执行代码。无法再从磁盘加载的代码。

您可以通过pinvoking SetErrorMode()来抑制错误。不确定,从未尝试过。但这并没有真正解决任何问题,可能发生的下一个最好的事情是Windows以一个模糊的错误终止程序。唯一合理的解决方案是让用户按照Windows的要求放回磁盘,或者从媒体运行安装程序,以便在硬盘驱动器上创建程序副本。

答案 2 :(得分:2)

使用EDITBIN /SWAPRUN告诉Windows您的可执行文件位于可移动设备上。它会在运行之前将其复制到交换文件中。

这是您通常为(例如)安装程序所做的事情。如果您依赖其他DLL,我不确定这是否有效,但我认为它确实如此。

对于其他资源,您希望在初始化期间尽快将它们复制到临时位置。

或者,您可以调用SetErrorMode来禁用消息框并正确处理错误。

答案 3 :(得分:0)

您可以像这样修改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.
        }
    }

这应该捕获您在应用程序本身中没有捕获的所有异常。