2016-07-15 3 views
0

Я объединил код, который выполняет итерации по всем моим каталогам на всех моих дисках, ища файлы, соответствующие критериям. Я надеялся документировать свой прогресс в процессе обработки, когда обрабатывал каждый из каталогов, записывая имена файлов совпадающих файлов в простую форму Windows («textBox1.Text = fi1.FullName;»); однако форма не становится видимой до тех пор, пока поиск не завершится. Хотя я подозреваю, что форма окна неактивна до конца поиска (поэтому запись на нее неэффективна), я не уверен, что делать, чтобы сделать форму видимой во время поиска. Могу ли я спросить, может ли кто-нибудь сделать минутку, посмотреть на код и посоветовать?Простая форма Windows, не отображающая

Благодарим за помощь.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Windows.Forms; 

namespace FindFiles 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      var searchPattern = ".jpg"; 
      var matchedFiles = FindMatchingFiles(searchPattern); 
     } 

     private List<string> FindMatchingFiles(string searchPattern) 
     { 
      var l = new List<string>(); 
      var allDrives = DriveInfo.GetDrives(); 

      foreach (var d in allDrives.Where(d => d.IsReady)) 
      { 
       foreach (var file in GetFiles(d.Name)) 
       { 
        if (!file.EndsWith(searchPattern)) continue; 
        var fi1 = new FileInfo(file); 
        textBox1.Text = fi1.FullName; 
        l.Add(file); 
       } 
      } 
      return l; 
     } 

     static IEnumerable<string> GetFiles(string path) 
     { 
      var queue = new Queue<string>(); 
      queue.Enqueue(path); 
      while (queue.Count > 0) 
      { 
       path = queue.Dequeue(); 
       try 
       { 
        foreach (var subDir in Directory.GetDirectories(path)) 
        { 
         queue.Enqueue(subDir); 
        } 
       } 
       catch (UnauthorizedAccessException) { } 
       string[] files = null; 
       try { files = Directory.GetFiles(path); } 
       catch (UnauthorizedAccessException) { } 
       if (files == null) continue; 
       foreach (var t in files) { yield return t; } 
      } 
     } 
    } 
} 

ответ

1

Проблема в том, что ваш поисковый код работает в потоке пользовательского интерфейса. Пользовательский интерфейс не будет обновляться до завершения вашего кода поиска.

Посмотрите на BackgroundWorker и его механизм ReportProgress, чтобы выполнить длинный код без блокировки пользовательского интерфейса.

+0

https://msdn.microsoft.com/en-gb/library/cc221403(v=vs.95).aspx может помочь. –

+0

Идеальное решение JSR. Спасибо. – Bill

Смежные вопросы