2015-12-05 261 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; 
}