gpt4 book ai didi

c# - directory.GetFiles,我如何让它在找到项目时吐出项目?

转载 作者:太空狗 更新时间:2023-10-29 22:24:15 25 4
gpt4 key购买 nike

我正在使用 Directory.GetFiles 给我 mp3 文件,我想用结果填充 ListBox,而不是停止程序它通过方法,我可以让它在获取 mp3 文件时搜索并填充 ListBox 吗?

所以我正在使用的是如下(它不能一次添加一个,它是在完成后一次添加它们)

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.GetFilesEnumerateFiles 将返回系统找到的文件 - 而不是等待找到所有文件。

在后台线程上执行此操作,并使用 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 目录只是因为它有很多文件,所以我可以测试它。不过在我的机器上几乎可以立即运行。

关于c# - directory.GetFiles,我如何让它在找到项目时吐出项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6064573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com