2011-05-19 13 views
5

Directory.GetFiles numaralı telefonu kullanarak beni mp3 dosyaları vermek ve ListBox sonuçları ile doldurmak istiyorum, ancak programın içinden geçerken programı durdurma yerine, ListBox numaralı telefonu arayabilir ve doldurabilir miyim? mp3 dosyalarını alır gibi?directory.GetFiles, öğeleri bulduğu şekilde tükürmek için nasıl alabilirim?

private List<string> Getmp3sFromFolders(string folder) 
    { 
     List<string> fileArray = new List<string>(); 

     try 
     { 
      DirectoryInfo dir = new DirectoryInfo(folder); 
      var files = dir.EnumerateFiles("*.mp3"); 
      foreach (var file in files) 
      { 

       fileArray.Add(file.FullName); 
       Dispatcher.BeginInvoke(_AddMP3ToListbox, file.Name); 
      } 

      var directories = dir.EnumerateDirectories(); 
      foreach (var subdir in directories) 
      { 
       fileArray.AddRange(Getmp3sFromFolders(subdir.FullName)); 

      } 

      // lblFolderSearching.Content = folder.ToString(); 
     } 
     catch 
     { 

     } 
     return fileArray; 
    } 

i _AddMP3ToListbox = AddMP3ToListbox

ekledin (bu seferde o bitince hepsini ekliyor ve o anda birer birer eklemek için başarısız) aşağıdaki gibi

yani ne ben kullanıyorum olduğunu

Gerçekten de mp3'leri liste kutusuna ekler, ancak bunu bulduğu anda değil, aynı anda yapar. Bunu nasıl düzeltebilirim?

cevap

11

Directory.GetFiles yerine Directory.EnumerateFiles kullanın. EnumerateFiles, dosyaları sistem tarafından bulunduğunuz gibi döndürecektir - bunların tümünü bulunmasını beklemeyin.

Bunu bir arka plan iş parçacığında gerçekleştirin ve her biri ListBox'a eklendiğinden, kullanıcı arabirimine Dispatcher.Invoke veya Dispatcher.BeginInvoke'u kullanın.

Birlikte attığım hızlı bir örnek.

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <ListBox x:Name="_FileList" /> 
     <Button Grid.Row="1" Content="Go!" Click="Button_Click" /> 
    </Grid> 
</Window> 

ve burada kod arkasında: İşte XAML var hiçbir şekilde

using System; 
using System.IO; 
using System.Windows; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private Action<string> _AddToListBox; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      _AddToListBox = AddToListBox; 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      Action action = Go; 
      action.BeginInvoke(null, null); 
     } 

     private void Go() 
     { 
      foreach (var file in Directory.EnumerateFiles(@"c:\windows\system32\")) 
      { 
       Dispatcher.BeginInvoke(_AddToListBox, file); 
      } 
     } 

     private void AddToListBox(string toAdd) 
     { 
      _FileList.Items.Add(toAdd); 
     } 
    } 
} 

bu bir best-practices veya her şeyi kapsayan örnek olması için ben niyetindesiniz. Sadece bunu yapmanın bir yolunu gösteriyorum. Bu arada, sistem32 dizinini seçtim çünkü içinde çok fazla dosya var, böylece test edebildim. Yine de neredeyse anında makinemde çalışıyor.

+0

Harika, EnumerateFiles'i eklediklerini bilmiyordum. –

+0

Yep. Son zamanlara kadar da bilmiyordum. O da Silverlight'ta. Bir şeyleri asynch yapmak için kesinlikle yararlıdır. – Tim

+0

Bana bir liste kutusuna çıkan örnek bir kod verebilir misin? Ben denedim ve GetFiles – darthwillard