2013-09-16 40 views
1

我想在012文件名的string []上應用一個過濾器,我從Directory.GetFiles()獲得,而無需在OpenFileDialog中打開它。將文件過濾器應用到文件名的字符串[],而不打開OpenFileDialog

有沒有什麼辦法可以應用所有這些濾波器(即我通常將適用於打開文件對話框) e.g:

openFileDialog.Filter = "Bitmap Images (*.bmp)|*.bmp|" + 
          "JPEG Images (*.jpeg, *.jpg)|*.jpeg;*.jpg|" + 
          "PNG Images (*.png)|*.png|" + ...; 

字符串[]。

我基本上想從FolderBrowserDialog中選擇文件夾,並從文件夾中選擇只有選定的文件 - 試圖找到某種方式來靜靜地執行此操作(將參數設置爲OpenFileDialog但不打開它)。

我只是嘗試以下操作:

OpenFileDialog openFileDialog = new OpenFileDialog(); 
      openFileDialog.InitialDirectory = folderdialog.SelectedPath; // here I get my folder path 
      openFileDialog.Filter = "Bitmap Images (*.bmp)|*.bmp|" + 
          "JPEG Images (*.jpeg, *.jpg)|*.jpeg;*.jpg|" + 
          "PNG Images (*.png)|*.png";     
      string [] fnms = openFileDialog.FileNames; // I wished this string arry to get poplulated with filtered file list - but doh! Obviously it didn't. 

誰能幫我找到一個解決的辦法。 有什麼辦法可以靜默地調用OpenFiledDialog嗎?或者會有任何LINQ查詢這個問題或任何這樣的。 [我是一個新手 - 但學習者]

任何幫助將不勝感激。 在此先感謝

回答

3

我不認爲多次調用Directory.GetFiles將是一個好主意,因爲它是一個IO操作。我建議你這樣做:

static string[] GetFiles(string directory, params string[] extensions) 
{ 
    var allowed = new HashSet<string>(extensions, StringComparer.CurrentCultureIgnoreCase); 

    return Directory.GetFiles(directory) 
        .Where(f => allowed.Contains(Path.GetExtension(f))) 
        .ToArray(); 
} 

static void Main(string[] args) 
{ 
    string[] files = GetFiles(@"D:\My Documents", ".TXT", ".docx"); 
    foreach(var file in files) 
    { 
     Console.WriteLine(file); 
    } 
} 
+0

我必須承認,我更喜歡你的答案(並贊同它)。我的一個批評是,你應該在這個實例中使用'EnumerateFiles'而不是'GetFiles',因爲你需要IENumerable仍然是'where',儘管如果你在一個目錄中有10k +文件,那麼只需要返回正確的類型 – Sayse

+0

謝謝。我們必須讀取所有文件名,所以使用EnumerateFiles不應該產生差異。延遲執行有助於讀取不需要的所有元素。 –

+0

謝謝@UsmanZafar。您的解決方案適合我。 將您的解決方案標記爲答案,因爲它充分描述並使用'params string [] extensions'給我留下了深刻的印象。 再次感謝 – Bhramar

2

未經測試,但應該工作

var formats = new string[]{"*.jpg","*.mp3"} 
formats.SelectMany(format => Directory.EnumerateFiles(dirpath, 
         format, SearchOption.AllDirectories) 
     .ToArray(); 
+0

謝謝!它的工作:) – Bhramar

+0

不用擔心:) .. – Sayse

相關問題