在可用的 .NETSystem.IO
方法/类中,检索远程网络共享上的整个目录列表的最有效方法是什么(假设是慢速、非 LAN 速度的链接)?
对于 10,000+ 个文件,需要抓取:
- 姓名
- 尺寸
- 上次修改日期
- 创建日期
FileInfo
循环遍历对象以获取此信息所需的时间与 Windows 资源管理器可以显示相同内容的时间似乎存在巨大的性能差异。
是的,这是在 .NET 1.0 中为 FileInfo 类所做的设计选择的副作用。构造 FileInfo 对象时它不存储属性值,当您使用属性获取器时,它会从文件中检索。这样一来,您始终可以获得房产的最新价值。当然,这对于 size 和 date 属性很重要,它们很容易发生变异。然而,通过网络的往返会使它变慢。
它在 .NET 4 中通过添加的 DirectoryInfo.EnumerateXxxx() 方法得到解决。对枚举器的强调现在很明显,您获得了文件信息的潜在陈旧副本。但是避免了往返。
如果您可以使用 .NET 4,则可以解决您的问题。如果您不能,则需要调用 FindFirstFile、FindNextFile、FindClose。
为了获得最佳性能,您可能需要使用 Win32 API,例如FindFirstFile、 FindNextFile、GetFileAttributesEx和GetFileSizeEx。
如果您想避免 Win32 调用,Directory.EnumerateFiles 比 Directory.GetFiles 更有效,因为它会在请求文件时懒惰地枚举文件,这可能会在内部使用更高效的 Win32 API。但是,由于您要通过网络,您实际上可能想要调用 Directory.GetFiles 来一次获取所有文件。实验。