gpt4 book ai didi

c# - 搜索目录中的所有文件时显示进度

转载 作者:太空狗 更新时间:2023-10-29 21:13:40 24 4
gpt4 key购买 nike

我之前问过这个问题 Get all files and directories in specific path fast为了尽快找到文件。我正在使用该解决方案来查找与正则表达式匹配的文件名。

我希望显示一个进度条,因为对于一些非常大和慢的硬盘驱动器,它仍然需要大约 1 分钟才能执行。我在另一个链接上发布的解决方案无法让我知道还有多少文件需要遍历才能显示进度条。

我正在考虑做的一个解决方案是尝试获取我计划遍历的目录的大小。例如,当我右键单击文件夹 C:\Users 时,我可以估计该目录的大小。如果我能够知道大小,那么我将能够通过添加我找到的每个文件的大小来显示进度。也就是说进度=(当前文件大小总和)/目录大小

出于某种原因,我无法有效地获取该目录的大小。

部分stack overflow的题目使用了如下的做法:

enter image description here

但请注意,我得到一个异常并且无法枚举文件。我很想在我的 C 盘上尝试这种方法。

在那张照片上,我试图计算文件的数量以显示进度。 我可能无法使用该方法有效地获取文件数量。当人们询问 如何获取目录中的文件数 以及人们询问 如何获取目录的大小 时,我只是尝试了一些关于堆栈溢出的答案。

最佳答案

解决这个问题会给你留下几种可能性之一......

  1. 不显示进度
  2. 使用预付费用进行计算(如 Windows)
  3. 执行操作同时计算成本

如果速度很重要,并且您希望目录树很大,我会倾向于这些选项中的最后一个。我在链接问题 Get all files and directories in specific path fast 上添加了一个答案这展示了一种比您当前使用的更快的文件和大小计数方法。要将其组合到选项 #3 的多线程代码段中,可以执行以下操作...

static void Main()
{
const string directory = @"C:\Program Files";
// Create an enumeration of the files we will want to process that simply accumulates these values...
long total = 0;
var fcounter = new CSharpTest.Net.IO.FindFile(directory, "*", true, true, true);
fcounter.RaiseOnAccessDenied = false;
fcounter.FileFound +=
(o, e) =>
{
if (!e.IsDirectory)
{
Interlocked.Increment(ref total);
}
};

// Start a high-priority thread to perform the accumulation
Thread t = new Thread(fcounter.Find)
{
IsBackground = true,
Priority = ThreadPriority.AboveNormal,
Name = "file enum"
};
t.Start();

// Allow the accumulator thread to get a head-start on us
do { Thread.Sleep(100); }
while (total < 100 && t.IsAlive);

// Now we can process the files normally and update a percentage
long count = 0, percentage = 0;
var task = new CSharpTest.Net.IO.FindFile(directory, "*", true, true, true);
task.RaiseOnAccessDenied = false;
task.FileFound +=
(o, e) =>
{
if (!e.IsDirectory)
{
ProcessFile(e.FullPath);
// Update the percentage complete...
long progress = ++count * 100 / Interlocked.Read(ref total);
if (progress > percentage && progress <= 100)
{
percentage = progress;
Console.WriteLine("{0}% complete.", percentage);
}
}
};

task.Find();
}

FindFile class实现可以在 FindFile.cs 找到.

根据您的文件处理任务的成本(上面的 ProcessFile 函数),您应该看到大量文件的进度非常清晰。如果您的文件处理速度非常快,您可能希望增加枚举开始和处理开始之间的延迟。

事件参数的类型是FindFile.FileFoundEventArgs并且是一个可变类,因此请确保您没有保留对事件参数的引用,因为它的值会发生变化。

理想情况下,您会希望添加错误处理以及可能中止两个枚举的能力。可以通过在事件参数上设置“CancelEnumeration”来中止枚举。

关于c# - 搜索目录中的所有文件时显示进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12379825/

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