2011-05-19 10 views
5

estoy usando Directory.GetFiles para darme archivos mp3, y me gustaría llenar un ListBox con los resultados, pero en lugar de detener el programa mientras pasa por el método, ¿puedo obtenerlo para buscar y llenar el ListBox hasta como obtiene los archivos mp3?directory.GetFiles, ¿cómo hago para escupir elementos como los encuentra?

Así que lo que estoy usando es el siguiente (y que está fallando para agregarlos uno en en el tiempo, que es la adición de todos a la vez cuando se hace)

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; 
    } 

Añadí _AddMP3ToListbox = AddMP3ToListbox

sí agrega los mp3 al cuadro de lista, pero lo hace todo a la vez, no tan pronto como lo encuentra. ¿Cómo puedo arreglar esto?

Respuesta

11

Utilice Directory.EnumerateFiles en lugar de Directory.GetFiles. EnumerateFiles devolverá los archivos tal como los encuentra el sistema, no esperará a que se encuentren todos.

Haga esto en un subproceso en segundo plano y use Dispatcher.Invoke o Dispatcher.BeginInvoke en el subproceso de interfaz de usuario ya que cada uno puede agregarlo al ListBox.

Aquí hay un ejemplo rápido que lancé. Aquí está el XAML:

<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> 

y aquí está el código subyacente:

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

de ninguna manera es mi intención para que esto sea un éxito de prácticas o que todo lo abarca ejemplo. Solo te muestro una forma de hacerlo. Por cierto, escogí el directorio system32 simplemente porque tiene muchos archivos, así que pude probarlo. Todavía funciona casi instantáneamente en mi máquina.

+0

Genial, no sabía que habían agregado EnumerateFiles. –

+0

Sí. No sabía hasta hace poco tampoco. También está en Silverlight. Definitivamente útil para hacer cosas asincrónicas. – Tim

+0

¿me puede dar un código de muestra en C# que da salida a un listbox? Lo intenté y estoy recibiendo tiempos más lentos que con GetFiles – darthwillard

Cuestiones relacionadas