2017-12-27 3 views
0

Ich bin auf der Suche nach einer Möglichkeit, nach bestimmten Dateierweiterungen sehr schnell zu suchen. Ich habe eine rekursive Methode versucht, aber es dauert zu lange, um alle Verzeichnisse auf dem Computer zu durchlaufen. Ich habe einen Weg gefunden, alle Dateien mit Dateierweiterungen über die Suchleiste im Dateiexplorer durch Eingabe von * .ISO zu finden, also gibt es eine Möglichkeit, diese Ergebnisse nach C# zu kopieren. Ich bin auch offen für alle anderen Methoden, die bei ähnlichen Geschwindigkeiten die gleichen Ergebnisse liefern. Ich werde später auch mehr als eine Dateiendung gleichzeitig suchen müssen.Eine schnelle Möglichkeit für die Suche nach Dateierweiterungen in C#

Dies war der rekursive Code, den ich ausprobierte.

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

Warum nutzen die optimierte Suche nicht in 'Directory.GetFiles gebaut ("C:", "* .iso", SearchOption.AllDirectories)'? – zambonee

+0

Das verursachte eine Ausnahme, wenn es die Dateien im Papierkorb durchging. Die Ausnahme war etwas über unbefugten Zugriff. –

Antwort

1

Schnellste seien:

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(); 

Danach Sie die Ausgabe aufspalten können mit \n

Dies sagt alle ISO-Dateien im Verzeichnis suchen + alle Unterverzeichnisse und nur Pfad geben + Dateinamen.

Sie können auch verwenden:

Directory.GetFiles(@"c:\", "*.iso", SearchOption.AllDirectories) 
Verwandte Themen