2016-07-07 29 views
0

在構造函數中。 filePathList是列表如何使該方法僅返回文件列表而不是目錄?

filePathList = SearchAccessibleFilesNoDistinct(rootDirectory, null).ToList(); 

而且SearchAccessibleFilesNoDistinct方法

IEnumerable<string> SearchAccessibleFilesNoDistinct(string root, List<string> files) 
     { 
      if (files == null) 
       files = new List<string>(); 
      if (Directory.Exists(root)) 
      { 
       foreach (var file in Directory.EnumerateFiles(root)) 
       { 
        string ext = Path.GetExtension(file); 
        if (!files.Contains(file) && ext == textBox2.Text) 
        { 
         files.Add(file); 
        } 
       } 
       foreach (var subDir in Directory.EnumerateDirectories(root)) 
       { 
        try 
        { 
         SearchAccessibleFilesNoDistinct(subDir, files); 
         files.Add(subDir); 
        } 
        catch (UnauthorizedAccessException ex) 
        { 
         // ... 
        } 
       } 
      } 
      return files; 
     } 

然後我讓環比列表filePathList

foreach (string file in filePathList) 
      { 
       try 
       { 
        _busy.WaitOne(); 
        if (worker.CancellationPending == true) 
        { 
         e.Cancel = true; 
         return; 
        } 

        bool reportedFile = false; 

        for (int i = 0; i < textToSearch.Length; i++) 
        { 
         if (File.ReadAllText(file).IndexOf(textToSearch[i], StringComparison.InvariantCultureIgnoreCase) >= 0) 
         { 
          resultsoftextfound.Add(file + " " + textToSearch[i]); 
          if (!reportedFile) 
          { 
           numberoffiles++; 
           MyProgress myp = new MyProgress(); 
           myp.Report1 = file; 
           myp.Report2 = numberoffiles.ToString(); 
           myp.Report3 = textToSearch[i]; 
           backgroundWorker1.ReportProgress(0, myp); 
           reportedFile = true; 
          } 
         } 
        } 
        numberofdirs++; 
        label1.Invoke((MethodInvoker)delegate 
        { 
         label1.Text = numberofdirs.ToString(); 
         label1.Visible = true; 
        }); 
       } 
       catch (Exception) 
       { 
        restrictedFiles.Add(file); 
        numberofrestrictedFiles ++; 
        label11.Invoke((MethodInvoker)delegate 
        { 
         label11.Text = numberofrestrictedFiles.ToString(); 
         label11.Visible = true; 
        }); 
        continue; 
       } 

的問題是,在止動部分restrictedFiles只是地目錄不文件。由於filePathList包含文件和目錄,並且它試圖在目錄中進行搜索時,它正在捕獲該文件。這不是一個限制文件,它只是目錄而不是文件。

這就是爲什麼我認爲SearchAccessibleFilesNoDistinct方法應該只返回沒有目錄作爲項目的文件。

例如在filePathList i的索引0看到:

C:\ TEMP

而在索引1

C:\ TEMP \的help.txt

第一項索引0將作爲受限制文件進入catch,第二個項目不會。

+3

只是不要將子目錄添加到列表中。你有一行'files.Add(subDir)',它將子目錄名稱添加到列表中。只要刪除該行。 –

回答

2

你有這樣的循環搜索搜索子目錄:

  foreach (var subDir in Directory.EnumerateDirectories(root)) 
      { 
       try 
       { 
        SearchAccessibleFilesNoDistinct(subDir, files); 
        files.Add(subDir); <--- remove this line 
       } 
       catch (UnauthorizedAccessException ex) 
       { 
        // ... 
       } 
      } 

刪除添加子目錄中的文件列表線。我在上面的代碼中標記了它。

2

難道你在尋找:

 Directory.GetFiles(rootDir,"*.*", SearchOption.AllDirectories); 

?更改僅用於掩蓋表單文本框。

相關問題