簡體   English   中英

directory.GetFiles,我如何讓它在找到它們時吐出物品?

[英]directory.GetFiles, how do i get it to spit out items as it finds them?

我正在使用Directory.GetFiles給我mp3文件,我想用結果填充ListBox ,但不是在它通過方法時停止程序,我可以讓它搜索並填充ListBox因為它獲取了mp3文件?

所以我正在使用的是如下(並且它未能在時間添加它們,它在完成后立即添加它們)

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

我添加了_AddMP3ToListbox = AddMP3ToListbox

它確實將mp3添加到列表框中,但它一次性完成,而不是一旦找到它。 我怎樣才能解決這個問題?

使用Directory.EnumerateFiles而不是Directory.GetFiles EnumerateFiles將返回系統找到的文件 - 而不是等待找到所有文件。

在后台線程上執行此操作,並使用Dispatcher.InvokeDispatcher.BeginInvoke到UI線程,因為每個線程都會將其添加到ListBox

這是我拼湊的一個簡單例子。 這是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>

這是代碼隱藏的代碼:

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

我絕不打算將此作為最佳實踐或包羅萬象的例子。 只是向您展示一種方法。 順便說一句,我選擇了system32目錄只是因為它有很多文件,所以我可以測試它。 雖然在我的機器上幾乎可以立即工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM