防病毒进度条

Posted

技术标签:

【中文标题】防病毒进度条【英文标题】:AntiVirus ProgressBar 【发布时间】:2011-11-04 11:11:23 【问题描述】:

我必须在我的AV中添加一个进度条,问题是我事先不知道要扫描多少个文件。所以我不知道总数。如果我计算要扫描的文件,然后软暂停一段时间,因为它必须遍历许多文件,并且在完全系统扫描的情况下,如果不需要长时间,则此暂停。因此我删除了该代码。我听说 avast 动态更改进度条值,即如果该值接近 100 并且找到更多要扫描的文件,则它将值推送到 50。编码是在 C# 中。

【问题讨论】:

您正在制作自己的杀毒软件,却不知道如何获取系统上的文件数?更令人沮丧的是你试图在 C# 中做到这一点。如果扫描系统导致暂停,则意味着您的扫描线程阻塞了 ui 线程,您应该在担心进度条之前解决这个问题。 为什么不使用两个线程,一个用于 AV,一个用于查找要扫描的文件数量,这将增加进度条的最大值。您无法确定文件的数量,因为用户可能会在扫描过程中创建/删除文件。 @Ramhound-你没有明白我在说什么..我知道如何获取文件总数,我正在递归地做,但是当我在递归循环中计算它们时,由于数千个文件,由于那个计数循环,我遇到了暂停。之后扫描没有问题。扫描很好 - @AndyChora - 如果递归循环导致暂停,那么它不是线程安全的。我仍然觉得你试图在你的技能水平上制作一些像反病毒程序一样先进的东西很奇怪。如果您使用递归函数来计算文件,那么您做错了。(至少在我看来。) 【参考方案1】:

在更新 UI 之前尝试一次性获取所有文件的列表是愚蠢的。

使用线程;用于定位文件并将其位置添加到队列中,并更新文件总数。

另一个进行扫描,并更新扫描文件的计数。

并且 UI 线程将基于此更新自身;所以上限会不断增加......或者,变得更加准确。

【讨论】:

这似乎是最好的解决方案。计算需要扫描的文件数量将花费很少。你甚至可以定位然后扫描文件,你甚至可以使用windows内置的索引服务来确定文件的数量。 并且不要忘记跨线程正确同步 ddata。【参考方案2】:

只需计算 5 级深度的文件夹,然后根据扫描的文件夹数量计算进度。增加部门以提高准确性(以预先计算时间为代价)。使用本文了解如何尽快枚举目录:MSDN How to: Enumerate Directories and Files

【讨论】:

【参考方案3】:

既然 AV 扫描应该定期进行,您能否只记住上次扫描中有多少文件,然后将其填充 5%?这将使用户大致了解无需立即进行最新的全面扫描需要多长时间。为了获得第一次扫描的准确数字,您必须进行完整的目录搜索并遭受您描述的暂停。至于自定义的单个文件夹,您可以存储前 2-3 级文件夹的文件数量,然后只需在其下方进行目录扫描,因为每个子目录中的文件数量会减少。

【讨论】:

这意味着原来的问题仍然存在,没有得到回答。 但是用户选择特定文件夹的自定义扫描呢?如何跟踪其中的所有文件夹和文件?你是说只有完整扫描我才能使用你所说的。看起来很有趣所以请你详细说明一下兄弟 这是一个与您不同的想法,OP 可以根据他拥有和未告诉我们的所有事实来确定该想法的优点。总体语言和“粗略的想法”一词都清楚地表明了警告。【参考方案4】:

我建议检查磁盘上有多少占用空间并根据密度评估文件数:每 GB 的文件数。首先,您必须假设在 1 GB 中存储了多少文件(对于我的系统,它是 3860) 在扫描期间,您将知道扫描硬盘的实际密度是多少,因此您可以调整文件数量。

在扫描期间调整文件总数是我能想到的最好方法,作为你的应用程序的用户,我更喜欢它,而不是等到你计算机器上的所有文件。

【讨论】:

这会更糟,除了全盘扫描。 我的解决方案有助于解决在检查将扫描多少文件期间不显示任何进度条的问题。使用两个线程的提议是 UI 或性能提示,并没有说明要扫描的文件数量。顺便说一句,使用两个线程,当两者都要求 IO 时不会加快很多。与往常一样,当您遇到此类问题时,您可以做的最好的事情是测试可能的选项。 简单逻辑:将文件列表的大小相加需要首先知道要添加哪些文件。这将比简单地知道文件数量需要更多的努力(相对)。同样,除非您只是在谈论全盘扫描。

以上是关于防病毒进度条的主要内容,如果未能解决你的问题,请参考以下文章

学习进度表

求C++病毒代码

使用带有设计器对象的线程 vb.net

pat-病毒溯源

[FJOI2007]轮状病毒

[bzoj1002]轮状病毒