2011-08-27 125 views
1

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

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

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

有什么方法可以找出缓存是否是最新的,例如:通过检索某种不需要再次计算所有大小的校验和?是否有另一种内存和CPU高效的方法来查明自上次计算以来文件大小是否发生了变化?或者还有另一种可能性?

+1

你见过TreeSize了吗? http://download.cnet.com/TreeSize-Free/3000-2248_4-11653027.html – David

+0

@大卫不,直到现在我还没有看到它。我知道有几个程序可以做到,但我想自己写一些这样的工具。 :) – RolandK

回答

1

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

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

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

为了保持高速缓存最新的将是困难的,因为:

  1. 根据不同的分区格式化类型[FAT,FAT32,NTFS等]您被限制为每个支持什么。
  2. 任何新文件(创建日期>缓存日期)意味着您仍然必须枚举所有文件以将列表筛选为新文件。
  3. 修改后的文件(修改日期>缓存日期)具有相同的问题。

除非您对C#提供的格式化类型非常特别,否则在每次启动应用程序时都需要更新缓存,而且会非常激烈。

+0

感谢您的答案,但获取文件夹的文件不是问题。监视大小可能无济于事,因为程序不运行时它们可能会更改。 – RolandK

+0

我会更新我的答案。 –

+1

对于NTFS,如果您可以找到使用它的方法是http://en.wikipedia.org/wiki/NTFS#USN_Journal,那么您的缓存只需要查看日记内的更改。 –

1

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

  • 假的吧。将文件夹层次结构显示为树形视图,并使用[+] 字形显示文件夹中包含文件或目录。 即使它没有。这是可见的,创建一个空目录并重新启动您的机器。注意[+]字形,点击它并注意, 当被迫迭代子目录时,它会平滑地将[+] 字形更改为'Nothing there'字形。

  • 延迟它。很难看到,你需要一个有很多 文件的子目录。资源管理器启动后台线程,该后台线程迭代文件夹的内容 。一旦找出它,它会平滑地更改状态栏文本 。

  • 告诉我发生了什么事。 Explorer严重使用ReadDirectoryChangesW() 。由FileSystemWatcher类包装在.NET中。关键点 是它得到一个通知,东西在用户正在查看的 子目录中更改。不需要轮询, 会有可怕的表现。回到第二项。