2015-11-24 64 views
0

我有一個C#4.0 .Net應用程序,它目前正在分析查找特定字符串的文本行,並且我想添加用於搜索所有目錄的複選框選項的功能,並且還可以通過擴展名或所有文件進行過濾。我應該爲代碼構建一個表達式還是有很多路徑?

我最終在四個可能的選擇中的每一個上使用Directory.EnumerateFiles語句執行了幾個if/else語句。

當我試圖分配Enumerable foreach來循環遍歷它們時,我一直被上面代碼的上下文置之不理。 我猜我需要包含每個EnumerateFiles if/else塊中的所有代碼,還是我?

我是一名VBA開發人員,努力向C#跳轉,我發現範圍和上下文對我來說是最大的挑戰。在VB中,我會建立一串選項,然後連接它們(&)以獲得可執行的代碼行,但用(+)和字符串變量嘗試這些代碼並沒有取得任何成功。

我在說的if/else塊在下面。

try 
     { 
      string sourceDirectory =txtFolder.Text; 
      var filters = new[] { txtFileExt.ToString() }; 
      var result = new List<string>(); 


      if (txtExtensionsFile == null) 
      { 
       if (chkSubFolderFiles.Checked) 
       { 
        var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.*", SearchOption.AllDirectories) ; 
       } 
       else 
       { 
        var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.*", SearchOption.TopDirectoryOnly) ; 
       } 
      } 
      else 
      { 
       if (chkSubFolderFiles.Checked) 
       { 
        var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.*", SearchOption.AllDirectories).Where(s => filters.Any(ext => ext == Path.GetExtension(s)))) ; 
       } 
       else 
       { 
        var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.*", SearchOption.TopDirectoryOnly).Where(s => filters.Any(ext => ext == Path.GetExtension(s)))) ; 
       } 
      } 
      foreach (string filename in txtFiles) 
      { 
       using (var reader = new StreamReader(filename)) 
       if (Path.GetExtension(filename) == txtFileExt.Text) 
    //continues on to parse out text from each file 
    } 
+0

有幾個不同的方法來做到這一點,而無需使用這麼多的冗餘代碼。例如,你可以使用變量替換此 var files = Directory.EnumerateFiles(@「C:\ path \ folder \」,「*。*」,SearchOption.AllDirectories) .Where(s => s.EndsWith(「。mp3」)|| s.EndsWith (「.jpg」));''你可以混合搭配......並且獲得所有文件 'var allFilenames = Directory.EnumerateFiles(path).Select(p => Path.GetFileName(p));'' – MethodMan

回答

0

你可以重寫你的if語句,例如像這樣

var searchOption = chkSubFolderFiles.Checked ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly; 
var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.*", searchOption); 
if (null != txtExtensionsFile) 
    txtFiles = txtFiles.Where(s => filters.Any(ext => ext == Path.GetExtension(s))); 
相關問題