C# OpenFileDialog:文件名、目录名或卷标语法不正确

C# OpenFileDialog: The filename, directory name, or volume label syntax is incorrect

我需要在 Visio 中以编程方式从 Sharepoint 打开文档。但是当我导航到网络文件夹,select 一个文档并单击打开时,我 出现以下错误:

The filename, directory name, or volume label syntax is incorrect

在搜索错误时,我找到了以下文档:https://msdn.microsoft.com/en-us/library/ms832054.aspx。所以我猜测文件名包含非法字符。我尝试使用 FileOk 事件覆盖文件名的验证:

public void openFile() {
    OpenFileDialog sf = new OpenFileDialog();
    sf.FileOk += openFileDialog_FileOk;
    if (sf.ShowDialog() == DialogResult.OK)
    {
        var app =(Microsoft.Office.Interop.Visio.Application)context.Application;
        app.Documents.Open(sf.FileName);
    }
}

private void openFileDialog_FileOk(object sender, CancelEventArgs e)
{
    var sfd = sender as OpenFileDialog;
    var file = new FileInfo(sfd.FileName);
    if (file.Name.Contains('#'))
        e.Cancel = true;
}

但是事件没有触发。使用标准的 Visio 界面可以从 Sharepoint 打开文件,但文件对话框看起来有点不同:

如何获得类似的文件对话框?所以我的问题是:如何以编程方式从 Sharepoint(网络文件夹)打开 Visio 文档?

由于 Visio 不提供 app.GetOpenFilename API,您真倒霉。但是您可以使用另一个办公应用程序来实现相同的目的。比如Excel:

var excel = new Excel.Application();
var fileName = excel.GetOpenFilename();
excel.Quit();

var visio = new Visio.Application();
visio.Documents.Open(fileName);

它提供了 "similar dialog" 和 "normal url",Visio API 可以毫无问题地理解它们。

问题可能是 Visio API 不理解带有 @SSL 部分的 UNC DAV 文件路径格式,这是默认提供的 "built-in" OpenFileDialog(或者也可能是其他东西) .检查默认对话框返回的 .FileName 的值是多少。顺便说一句,为了防止错误消息,设置sf.CheckFileExists = false就足够了,也许就足够了。