计算和缓存文件夹大小

本文关键字:文件夹 缓存文件 缓存 计算 | 更新日期: 2023-09-27 18:06:45

我有一个c#程序的想法,基本像Windows资源管理器一样工作。其目的是显示所有文件和文件夹,并显示每个文件和文件夹的特定信息。我计划的功能之一是检测文件夹大小,这是资源管理器无法做到的。

我对算法的想法是累积特定文件夹中所有文件的大小。但是,我担心性能问题。例如,要显示C:中所有文件夹的大小,我必须考虑整个驱动器上的所有文件。这可能需要一段时间,因此不能每次用户切换到不同的文件夹或返回时都进行计算。

所以我想缓存一些大小。但是,当文件更改、添加或删除时,缓存数据就会过时。但是我不想在程序不运行时监视所有的文件更改。

是否有任何方法我可以找出如果缓存是最新的,例如,通过检索某种校验和,不需要再次计算所有大小?是否有另一种内存和cpu效率高的方法来确定自上次计算以来文件大小是否发生了变化?或者还有其他可能吗?

计算和缓存文件夹大小

Windows资源管理器有可用的文件夹大小(# files,磁盘大小等),可用于任何磁盘/文件夹的属性。目录属性示例

对于编写程序,您当然可以使用递归DirectoryInfo.EnumerateFiles()来获取磁盘/文件夹中的所有文件。

至于监视,您可以使用FileSystemWatcher类来监视对任何磁盘/文件夹的更改。

保持缓存更新将是困难的,因为:

    根据分区格式化类型[Fat, Fat32, NTFS等],您仅限于每种支持。
  1. 任何新文件(创建日期>缓存日期)意味着您仍然必须枚举所有文件以过滤列表到新文件。
  2. 修改的文件(修改日期>缓存日期)也有同样的问题。
除非你在c#提供之外使用一些非常特定于格式化类型的东西,否则在应用程序启动后每次都需要更新缓存,并且非常频繁。

Windows资源管理器是一个相当巧妙的程序。它充满了旨在隐藏任何文件系统迭代速度都非常慢的事实的技巧。我所知道的技巧:

  • 假。将文件夹层次结构显示为树形视图,并使用[+]字形,显示文件夹中有文件或目录。即使事实并非如此。这是可见的,创建一个空目录和重新启动计算机。注意[+]符号,点击它,注意,当强制迭代子目录时,它会平滑地更改[+]

  • 延迟。更难看到的是,你需要一个子目录有很多文件。资源管理器启动一个后台线程,迭代文件夹的内容。一旦它弄明白了,它就会顺利地改变

  • 告诉我发生了什么事。浏览器使用ReadDirectoryChangesW()严重。由。net中的FileSystemWatcher类封装。关键它会收到一个通知,告诉中发生了变化吗用户正在查看的子目录。不需要轮询会有可怕的效果。