计算和缓存文件夹大小

时间:2011-08-27 22:15:13

标签: c# .net performance directory

我对C#程序有一个想法,它基本上像Windows资源管理器一样工作。目的是显示所有文件和文件夹,并显示每个文件和文件夹的具体信息。我正在计划的一个功能是检测文件夹大小,这是资源管理器无法做到的。

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

所以我想缓存一些尺寸。但是,当文件更改,添加或删除时,缓存数据将过时。但我不希望在程序未运行时监视所有文件更改。

有什么方法可以判断缓存是否是最新的,例如通过检索某种不需要再次计算所有大小的校验和?是否有另一种内存和CPU高效的方法来确定自上次计算以来文件大小是否已更改?或者还有其他可能性吗?

2 个答案:

答案 0 :(得分:1)

Windows资源管理器具有可用的文件夹大小(#文件,磁盘大小等),可用于任何磁盘/文件夹的属性。 Directory Properties Example

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

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

要使缓存保持最新是困难的,因为:

  1. 根据分区形式类型[Fat,Fat32,NTFS等],您受限于每个支持。
  2. 任何新文件(创建日期>缓存日期)意味着您仍需要枚举所有文件以将列表过滤为新文件。
  3. 修改过的文件(修改日期>缓存日期)也存在同样的问题。
  4. 除非您使用非常特定于C#提供的格式化类型的内容,否则每次都需要在应用程序启动后更新缓存,并且非常激烈。

答案 1 :(得分:1)

Windows资源管理器是一个非常狡猾的程序。它充满了一些技巧,旨在隐藏任何文件系统迭代速度极慢的事实。我知道的那种技巧:

  • 假装它。将文件夹层次结构显示为树视图并使用[+] 字形显示文件夹中包含文件或目录。 即使它没有。这是可见的,创建一个空目录和 重启你的机器。注意[+]字形,单击它并注意到, 当被迫迭代子目录时,它顺利地改变了[+] 字形为'没有'字形。

  • 延迟它。更难看,你需要一个有很多的子目录 文件。 Explorer启动一个后台线程来迭代 文件夹的内容。一旦弄明白,它就会顺利变化 状态栏文本。

  • 告诉我发生了什么事。 Explorer使用ReadDirectoryChangesW() 巨资。由FileSystemWatcher类包装在.NET中。关键点 是它收到通知某事在 用户正在查看的子目录。不需要民意调查 会有可怕的性能。回到第二章。