Microsoft.Win32中的OpenFileDialog.FileName返回空字符串

时间:2015-12-05 20:21:39

标签: c# openfiledialog

我正在使用控制台应用程序测试类,并且在类中要求用户选择文件。我创建一个OpenFileDialog类实例,设置过滤器,激活multiselect并调用ShowDialog()。我选择一个文件/ s并返回true但是FileName字段中有一个空字符串,FileNames中有一个0项字符串[]。我错过了什么?

以下是代码:

private static string[] OpenFileSelector(string extension1)
{
    OpenFileDialog op = new OpenFileDialog();
    op.InitialDirectory = @"C:\";
    op.Title = "Seleccione los archivos";
    op.Filter = "|*." + extension1;
    op.Multiselect = true;

    bool? res = op.ShowDialog();

    if (res != null && res.Value) return op.FileNames;
    return null;
}

扩展永远不会为空,我尝试过多个文件扩展名。为了记录,我在Win32之前使用了Forms类,它工作正常。

1 个答案:

答案 0 :(得分:2)

我同意评论说,在控制台应用程序中使用对话框窗口并不理想,至少可以这么说。对于显示窗口的命令行工具,即使在Visual Studio工具中也有历史先例,但在这些情况下,它是一个非常有限的场景:命令行帮助的GUI版本。如果你想要一个控制台程序,编写一个控制台程序并放弃GUI。如果你想要GUI,那么编写一流的GUI程序并将控制台窗口从中移出。

也就是说,在我看来,您的问题与程序的控制台性质无关。相反,它只是表示您没有为文件类型过滤器提供说明。我不清楚为什么这会改变对话框的行为,但确实如此。换成这样的东西:

private static string[] OpenFileSelector(string description, string extension1)
{
    if (string.IsNullOrEmpty(description))
    {
        throw new ArgumentException("description must be a non-empty string");
    }

    OpenFileDialog op = new OpenFileDialog();
    op.InitialDirectory = @"C:\";
    op.Title = "Seleccione los archivos";
    op.Filter = description + "|*." + extension1;
    op.Multiselect = true;

    bool? res = op.ShowDialog();

    if (res != null && res.Value) return op.FileNames;
    return null;
}