gpt4 book ai didi

c# - 有没有办法停止 Directory.GetFiles 搜索

转载 作者:行者123 更新时间:2023-12-04 12:17:50 24 4
gpt4 key购买 nike

我正在使用 Directory.GetFiles()搜索多文件夹目录中的文件,而其中一些文件夹太大,因此搜索可能需要长达 60 秒。在下面的代码中,搜索在用户停止输入后一秒钟开始,当用户输入文件名并且在输入时不会暂停但如果他/她在单词中间暂停搜索将开始并且将即使他/她再次开始打字,也不会停止直到它完成。

我想做的是在用户输入时停止搜索,可能是在 inputFileName_TextChanged 方法中。

有没有办法停止使用 Directory.GetFiles 时已经开始的搜索?

using System.Timers;
using System.IO;

namespace findFileTest
{

public partial class MainWindow : Window
{
Timer timer = new Timer();

public MainWindow()
{
InitializeComponent();

timer.Elapsed += new ElapsedEventHandler(TimerEvent);
timer.Interval = 1000;
timer.Enabled = true;
timer.Stop();
}

private void inputFileName_TextChanged(object sender, TextChangedEventArgs e)
{
// How to stop the search currently in process here
timer.Stop();
timer.Start();
}

public void TimerEvent(object source, ElapsedEventArgs e)
{
timer.Stop();
findFile();
}

private void findFile()
{
string fName = "";

this.Dispatcher.Invoke(() => {
fName = inputFileName.Text;
});

var fType = ".txt";
var fileName = fName.Trim() + fType;

var file = Directory.GetFiles(@"C:\TestFolder\", fileName, SearchOption.AllDirectories).FirstOrDefault();
if (file == null) {
Console.WriteLine("File not found");
}
else {
Console.WriteLine("Found:" + file);
}
}
}
}

最佳答案

Is there a way to stop a search that has been already started when using Directory.GetFiles?



不,不安全。 GetFiles()方法不提供任何机制在它返回之前中断其工作。您将不得不中止线程,这会导致许多其他问题。

this comment 中所述,从字面上理解您的请求,答案是使用 Directory.EnumerateFiles()方法代替。此方法显示底层 FindFirstFile() 的语义和 FindNextFile() , 通过提供一次返回一个文件的枚举器。每次返回新文件时,您都有机会中断枚举并返回,而无需做更多工作。

请注意,即使使用 EnumerateFiles() ,在找到与您的搜索模式匹配的内容之前,您不会获得第一个文件结果。如果您切换到使用 EnumerateFiles() 很可能,您还需要对输入进行自己的匹配,而不是让 EnumerateFiles()做吧。 IE。通 "*"作为搜索字符串。这将稍微减慢整体操作的速度,但您将有机会中断搜索目录和子目录中每个文件的操作,而不仅仅是在找到匹配文件时。

最后,我建议考虑到您明显的用例,您可能需要重新考虑使用 Directory上课。根据您发布的代码,每次用户输入一些新文本时,您都会启动对文件系统的搜索,这必然是一个缓慢的操作。恕我直言,最好建立一次索引(例如 Dictionary<string, List<string>> 将没有扩展名的文件名映射到目录中每个匹配文件的完整路径 - 即 Path.GetFileNameWithoutExtension())。这样,您就不必中断任何事情。用户输入文本后的“搜索”部分几乎是即时的。

在目录完全索引之前当然会有一个初始延迟。这取决于你想如何处理。但我建议提供一种机制,既可以向用户表明索引未完全完成,又可以检查您拥有的内容,以防万一用户正在查找的文件与已编入索引的文件相匹配。

请注意,通常使用的 Windows 文件系统——FAT、FAT32、NTFS 等——不区分大小写,所以你想用 StringComparer.OrdinalIgnoreCase 来初始化你的字典。 . “Ordinal”,因为文件系统名称需要匹配用户键入的确切字符,“ignore case”使搜索不区分大小写。

我猜想在您的场景中,当用户使用您的程序搜索文件时,不太可能添加或删除文件。但是,如果您担心这种情况,您可以只为用户提供一个“刷新”按钮以强制重新索引目录,或者使用 FileSystemWatcher如果添加或删除文件,则自动更新索引。

关于c# - 有没有办法停止 Directory.GetFiles 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46875828/

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