c# - 来自 Microsoft.Win32 的 OpenFileDialog.FileName 返回空字符串

标签 c# openfiledialog

我正在使用控制台应用程序测试一个类,在该类中要求用户选择一个文件。我创建一个 OpenFileDialog 类实例,设置过滤器,激活多选并调用 ShowDialog()。我选择一个文件,它返回 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 类并且它工作正常。

最佳答案

我同意这样的评论,即至少可以说,在控制台应用程序中使用对话窗口并不理想。对于显示窗口的命令行工具,即使在 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;
}

关于c# - 来自 Microsoft.Win32 的 OpenFileDialog.FileName 返回空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34110411/

相关文章:

c# - CrossThreadMessagingException WPF OpenFileDialog

c# - Catch block 的顺序重要吗?

c# - 打开文本文件,遍历内容并检查

c# - 存储库模式——根据类型查找存储库

c# - 通过鼠标单击获取图表上的 x 坐标

c# - 检查文件扩展名是否是图像的好方法

c# - C#WinForms应用程序-使用OpenFileDialog,MultiSelect,日志记录调试错误

c# - .NET OpenFileDialog 是否可以设置为允许用户选择 .lnk 文件

c# - 删除托 pipe 列表的最佳方法。一对多/父子关系

c# - 从对 LyncClient.GetClient() 的调用中获取无效对象