gpt4 book ai didi

c# - 如何优化我的目录文件搜索方法?

转载 作者:行者123 更新时间:2023-12-02 18:00:00 25 4
gpt4 key购买 nike

我的任务是在具有许多子目录的网络位置中查找文件。我当前的实现基于我在 stackoverflow 上找到的答案:

private void PollFolder(string sourceDir)
{
try
{
// var start = DateTime.Now.AddHours(-_filesToGetTimeRangeFromNowInDays);
var start = DateTime.Now.AddMonths(-5);
var end = DateTime.Now;

var filesFromToolDir = Directory.GetFiles(sourceDir, "*.gz", SearchOption.AllDirectories)
.Where(f => new FileInfo(f).CreationTime >= start
&& new FileInfo(f).CreationTime <= end)
.ToArray();
}
catch (Exception ex)
{
}
}

我应该在用户给定的特定时间范围内按创建日期过滤文件。这里我以 5 个月为例。此功能的问题在于,对于某些目录,查找指定时间范围内的文件最多可能需要 5 个小时。

我的问题:有没有什么方法可以优化并使此文件在具有许多子目录的网络文件夹中搜索得更快?有没有更好的方法来查找文件?

最佳答案

您发出的网络请求比您需要的多。 Directory.GetFiles() 发出网络请求,但只返回一个字符串。然后你使用了 new FileInfo(f).CreationTime 两次,但是因为你创建了一个新的 FileInfo 对象两次,它发出了两次网络请求来获取相同的信息.

您可以使用 DirectoryInfo.EnumerateFiles() 减少它,它返回 FileInfo 对象而不仅仅是文件名。这样,您就可以将创建时间作为结果的一部分。

var start = DateTime.Now.AddMonths(-5);
var end = DateTime.Now;

var dir = new DirectoryInfo(sourceDir);
var filesFromToolDir = dir.EnumerateFiles("*.gz", SearchOption.AllDirectories)
.Where(f => f.CreationTime >= start
&& f.CreationTime <= end)
.ToArray();

理想情况下,您只想向服务器询问您需要的信息,而不是请求所有内容并丢弃结果。遗憾的是,您不能在这里这样做。


这可能只与 .NET Core 相关:

EnumerateFiles(在 DirectoryDirectoryInfo 类中),使用 native Windows NtQueryDirectoryFile功能,您可以在 code here 中看到,并且该函数仅提供按文件名过滤的选项。

事实上,这里的 .NET 代码并不好,因为它 always passes null for the FileName parameter .因此,即使您请求 *.gz,它仍然会从服务器获取每个文件并在本地进行过滤。

关于c# - 如何优化我的目录文件搜索方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74646457/

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