如何在WPF OpenFileDialog中禁用正在使用的文件?

时间:2013-01-01 10:56:41

标签: wpf openfiledialog

我的WPF应用使用Microsoft.Win32.OpenFileDialog选择要打开的SQL Server 2008数据库。

它工作正常,但是有一个问题:当对话框中选择的数据库以前在上次启动后的某个时间打开时,该文件似乎在后台由SQL服务器保持打开状态(即使它未被我打开)应用程序和我的应用程序已重新启动)。当在OpenFileDialog中单击“确定”时,这会导致“另一个应用程序使用的文件”警告,并且在重新启动计算机之前,我无法使用该对话框打开该特定数据库。似乎OpenFileDialog尝试打开所选文件并执行该操作,发现它已被另一个应用程序(SQL Server)打开。如何禁止OpenFileDialog尝试打开所选文件,只返回所选文件的文件名而不进行任何检查?

我的代码如下所示:

public void OpenDatabase() {
    // Let user select database to open from file browser dialog
    // Configure open file dialog box
    var dlg = new Microsoft.Win32.OpenFileDialog();
    dlg.FileName = ""; // Default file name
    dlg.DefaultExt = ".mdf"; // Default file extension
    dlg.Filter = "Databases (.mdf)|*.mdf|All Files|*.*"; // Filter files by extension 
    dlg.CheckFileExists = false;
    dlg.CheckPathExists = false;

    // Show open file dialog box
    bool? result = dlg.ShowDialog();    // Gives file in use warning second time!

    // Process open file dialog box results 
    if (result == true) {
        // Open document 
        string filename = dlg.FileName;
        TryOpenDatabase(filename);
    }
}

2 个答案:

答案 0 :(得分:5)

对于早期Windows版本,基础选项为OFN_NOVALIDATE,对于Windows和.NET的更高版本,您可以在Vista对话框中使用FOS_NOVALIDATE。来自MSDN的描述:

  

请勿检查阻止应用程序打开所选文件的情况,例如共享违规或访问被拒绝的错误。

您现在看到的是,对话框发现数据库文件存在共享冲突。事实上,这个选项在OpenFileDialog包装类上公开,添加这行代码来解决你的问题:

  dlg.ValidateNames = false;

答案 1 :(得分:3)

MSDN论坛has a post about this

在OpenFileDialog API中,您可以使用

关闭它
ValidateNames = false
<{1>}上的