2016-06-20 2 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とtryを使用していますが、ディレクトリのひとつがプログラム停止を拒否してしまったということです。そして私はそれを次のディレクトリに続けてほしい。ファイルの取得時にアクセスが拒否されたかどうかを確認するにはどうすればよいですか?

たとえば、私はファイルが10個のディレクトリに450個あり、2番目のディレクトリにアクセスが拒否されてから次のディレクトリに移動するというように続きます。

+1

Sleep()とは何ですか? BackgroundWorkerを使用する場合は、Invoke()の代わりにReportProgress()を使用するのが一般的です。 – MickyD

答えて

1

あなたはtry.. catchブロック内の読み出し処理を同封する必要があります

  • ためいくつかの提案。指定されたファイルにアクセスできない場合は、アクセス拒否例外がスローされます。
  • restrictedFilesを使用すると、スキップされたファイルを追跡できます。
  • キャッチで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を試すことができますが、それは完全に正確ではないかもしれません。

関連する問題