2015-12-05 249 views
3

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

下面是代码:

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类,它工作正常。

+0

尝试以下 'op.Filter ='文本文件(* .txt)| * .TXT |所有文件(*。*)| *'如果你需要添加不同的类型,那么你应该很可能使用'string.Format'函数来构建过滤器,为什么你不首先看这里[MSDN OpenFileDialog.Filter Property](https://msdn.microsoft.com/en-us/library/ system.windows.controls.openfiledialog.filter(v = vs.95).aspx) – MethodMan

+4

控制台模式应用程序对于此对话来说是一个相当不友好的地方,它需要一个STA线程。你有一个错误,你的过滤器属性分配不正确。考虑op.Filter = extension1 +“files | *”。 + extension1; –

+0

是否足以测试null和res而不是res.Value? “return op.FileNames [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; 
}