2016-06-20 44 views
-1
private void DirSearch(string root, string filesExtension,string textToSearch, BackgroundWorker worker, DoWorkEventArgs e) 
     { 
      string[] filePaths = null; 
      int numberoffiles = 0; 
      int numberofdirs = 0; 
      try 
      { 
       filePaths = Directory.GetFiles(root, filesExtension, SearchOption.AllDirectories); 
      } 
      catch(Exception err) 
      { 
       string ad = err.ToString(); 
      } 
      if (filePaths != null && filePaths.Length > 0) 
      { 
       for (int i = 0; i < filePaths.Length; i++) 
       { 
        _busy.WaitOne(); 
        if (worker.CancellationPending == true) 
        { 
         e.Cancel = true; 
         return; 
        } 

        List<MyProgress> prog = new List<MyProgress>(); 
        int var = File.ReadAllText(filePaths[i]).Contains(textToSearch) ? 1 : 0; 
        if (var == 1) 
        { 
         string filename = filePaths[i];//filePaths[i].Split('\\').Last(); 
         numberoffiles++; 
         prog.Add(new MyProgress { Report1 = filename, Report2 = numberoffiles.ToString() }); 
         backgroundWorker1.ReportProgress(0, prog); 
         Thread.Sleep(100); 
        } 
        numberofdirs++; 
        label1.Invoke((MethodInvoker)delegate 
           { 
            label1.Text = numberofdirs.ToString(); 
            label1.Visible = true; 
           }); 
        Thread.Sleep(100); 
       } 
      } 
     } 

我使用try和catch的問題是,一旦一個目錄被訪問被拒絕,程序就停止。我希望它繼續到下一個目錄。如何在獲取文件時檢查訪問被拒絕?

如果在filePaths中,例如,我在10個目錄中有450個文件,在第二個目錄中它的訪問被拒絕,然後繼續到下一個目錄等等。

+1

什麼是睡眠()?如果你打算使用BackgroundWorker,那麼慣例是使用ReportProgress()而不是Invoke() – MickyD

回答

1

幾個建議供您參考

  • 你應該附上try.. catch塊內的讀取過程。因此如果指定的文件不可訪問,Access-Denied Exception將拋出。使用restrictedFiles來跟蹤跳過的文件。
  • 在catch中使用continue;以繼續迭代。

讓我重命名變量以便更好地理解;現在考慮代碼

void DirSearch(string rootDirectory, string filesExtension, string textToSearch, BackgroundWorker worker, DoWorkEventArgs e) 
{ 
    List<string> filePathList = new List<string>(); 
    List<string> restrictedFiles = new List<string>(); 
    // Other Inits 
    try 
    { 
     filePathList = Directory.GetFiles(rootDirectory, filesExtension, SearchOption.AllDirectories).ToList(); 
    } 
    catch (Exception err) 
    { 
     string ad = err.ToString(); 
    } 
    foreach (string file in filePathList) 
    { 
     try 
     { 
      // Code before 
      int var = File.ReadAllText(file).Contains(textToSearch) ? 1 : 0; 
      // it will throw exception if it is not accessible 
      // Your code after 
     } 
     catch (Exception) 
     { 
      restrictedFiles.Add(file); 
      continue; 
     } 
    } 
    // restrictedFiles will contains all restricted files @ the end of iteration 
} 
2

您需要注意File.ReadAllText(...)調用正在進行的UnauthorizedAccessException。環繞在try/catch中的讀取操作,並在拋出異常時使用continue關鍵字。您可以嘗試和check for accessibility,但這可能不完全準確。