2017-12-27 6 views
0

特定のファイル拡張子をすばやく検索する方法を探しています。再帰的な方法を試しましたが、コンピュータ上のすべてのディレクトリを調べるのに時間がかかります。 * .ISOと入力してファイルエクスプローラの検索バーを使用してファイル拡張子を持つすべてのファイルを見つける方法を見つけました。その結果をC#にコピーする方法があります。私は同様のスピードで同じ結果を出す他の方法についてもオープンしています。また、後で複数のファイル拡張子を同時に検索する必要があります。C#でファイル拡張子をすばやく検索する

これは私が試した再帰的なコードでした。

private void frmSearch_Load(object sender, EventArgs e) 
    { 
     Thread thread = new Thread(intermediate); 
     thread.Start(); 
    } 

    private void intermediate() 
    { 
     DriveInfo[] driveInfo = DriveInfo.GetDrives(); 
     foreach (var letter in driveInfo) 
     { 
      GetIsoFiles(letter.Name); 
     } 
    } 

    private void GetIsoFiles(string dir) 
    { 
     try 
     { 
      var isoFiles = Directory.GetFiles(dir, "*.iso", SearchOption.TopDirectoryOnly); 
      foreach (var file in isoFiles) 
      { 
       appendFilebox(file); 
      } 
     } 
     catch (Exception) { } 

     foreach (var subdirectory in Directory.GetDirectories(dir)) 
     { 
      try 
      { 
       GetIsoFiles(subdirectory); 
      } 
      catch { } 
     } 
    } 

    private void appendFilebox(string Value) 
    { 
     if (InvokeRequired) 
     { 
      this.Invoke(new Action<string>(appendFilebox), new object[] { Value }); 
      return; 
     } 
     rtbFile.Text += Value; 
    } 
+0

'Directory.GetFilesに内蔵されて最適化された検索使用しないのはなぜ( "C:"、 "* .ISO"、SearchOption.AllDirectoriesを)'? – zambonee

+0

ごみ箱のファイルを通過しているときに例外がスローされました。例外は不正アクセスに関するものです。 –

答えて

1

最速は次のようになります。あなたはこのディレクトリ内のすべてのISOファイル+すべてのサブディレクトリを検索し、パスだけを与えることを言っている\n

を使用して出力を分割することができます。この後

Process p = new Process(); 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.FileName = @"c:\windows\system32\cmd.exe"; 
p.StartInfo.Arguments = "/c dir c:\*.iso /s /b"; 
p.Start(); 
string output = p.StandardOutput.ReadToEnd(); 
p.WaitForExit(); 

+ファイル名。

ます。また、使用することができます。

Directory.GetFiles(@"c:\", "*.iso", SearchOption.AllDirectories) 
関連する問題