最快的.NET方法从远程网络共享中的文件中检索大多数元数据?

时间:2011-09-30 18:51:04

标签: c# .net-4.0 io .net fileinfo

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

对于10,000多个文件,需要抓住:

  1. 名称
  2. 尺寸
  3. 上次修改日期
  4. 创建日期
  5. 此信息循环FileInfo个对象所花费的时间与Windows资源管理器显示相同内容的时间相比,似乎存在巨大的性能差异。

2 个答案:

答案 0 :(得分:7)

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

使用添加的DirectoryInfo.EnumerateXxxx()方法在.NET 4中解决了这个问题。强调一个枚举器现在很明显你得到了一个可能过时的文件信息副本。但是避免往返。

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

答案 1 :(得分:2)

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

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