OpenFileDialog.FileName 来自 Microsoft.Win32 返回空字符串

OpenFileDialog.FileName from Microsoft.Win32 returning empty strings

我正在使用控制台应用程序测试 class,在 class 中要求用户 select 一个文件。我创建一个 OpenFileDialog class 实例,设置过滤器,激活 multiselect 并调用 ShowDialog()。我 select a file/s 并且它 returns 是正确的,但是 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 class,它运行良好。

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

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

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;
}