0

在可用的 .NETSystem.IO方法/类中,检索远程网络共享上的整个目录列表的最有效方法是什么(假设是慢速、非 LAN 速度的链接)?

对于 10,000+ 个文件,需要抓取:

  1. 姓名
  2. 尺寸
  3. 上次修改日期
  4. 创建日期

FileInfo循环遍历对象以获取此信息所需的时间与 Windows 资源管理器可以显示相同内容的时间似乎存在巨大的性能差异。

4

2 回答 2

7

是的,这是在 .NET 1.0 中为 FileInfo 类所做的设计选择的副作用。构造 FileInfo 对象时它不存储属性值,当您使用属性获取器时,它会从文件中检索。这样一来,您始终可以获得房产的最新价值。当然,这对于 size 和 date 属性很重要,它们很容易发生变异。然而,通过网络的往返会使它变慢。

它在 .NET 4 中通过添加的 DirectoryInfo.EnumerateXxxx() 方法得到解决。对枚举器的强调现在很明显,您获得了文件信息的潜在陈旧副本。但是避免了往返。

如果您可以使用 .NET 4,则可以解决您的问题。如果您不能,则需要调用 FindFirstFile、FindNextFile、FindClose。

于 2011-09-30T20:16:03.807 回答
2

为了获得最佳性能,您可能需要使用 Win32 API,例如FindFirstFileFindNextFileGetFileAttributesExGetFileSizeEx

如果您想避免 Win32 调用,Directory.EnumerateFiles 比 Directory.GetFiles 更有效,因为它会在请求文件时懒惰地枚举文件,这可能会在内部使用更高效的 Win32 API。但是,由于您要通过网络,您实际上可能想要调用 Directory.GetFiles 来一次获取所有文件。实验。

于 2011-09-30T20:09:10.920 回答