【问题标题】:How to disable file in use check in WPF OpenFileDialog?如何在 WPF OpenFileDialog 中禁用文件使用检查?
【发布时间】:2012-12-16 02:22:06
【问题描述】:

我的 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);
    }
}

【问题讨论】:

  • 我删除了您提到的 WPF(与任何代码和问题完全无关)并将其重新标记为 WinApi。说真的,如果您对 WPF 没有任何问题,请不要假装有问题。是Win32.OpenFIleDialog,Win32不是WPF。

标签: wpf openfiledialog


【解决方案1】:

底层选项是 OFN_NOVALIDATE 用于早期 Windows 版本,FOS_NOVALIDATE 用于您在更高版本的 Windows 和 .NET 上获得的 Vista 对话框。来自 MSDN 的描述:

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

这就是您现在看到的情况,对话框显示数据库文件存在共享冲突。这个选项实际上暴露在 OpenFileDialog 包装类上,添加这行代码来解决你的问题:

  dlg.ValidateNames = false;

【讨论】:

  • 谢谢,效果很好!不知道我怎么会错过那个选项。
【解决方案2】:

MSDN 论坛has a post about this

它在 OpenFileDialog API 中,您可以使用关闭它

ValidateNames = false

Dialog

【讨论】:

  • 谢谢。这有助于防止我把所有的头发都拉出来。尝试重新打开 Excel 文件时,关闭命令、阅读器和 OldDbConnection 不起作用。没有其他用户,不涉及网络。只有我和我的测试文件。
猜你喜欢
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2012-06-16
  • 2022-01-11
  • 2020-08-17
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
相关资源
最近更新 更多