在可用的.NET System.IO
方法/类中,检索远程网络共享上的整个目录列表的最有效方法是什么(假设一个缓慢的非LAN速度链接)?
对于10,000多个文件,需要抓住:
此信息循环FileInfo
个对象所花费的时间与Windows资源管理器显示相同内容的时间相比,似乎存在巨大的性能差异。
答案 0 :(得分:7)
是的,这是在.NET 1.0中为FileInfo类进行设计选择的副作用。它在构造FileInfo对象时不存储属性值,在使用属性getter时从文件中检索它。这样,您始终可以获得房产的最新价值。这当然对于大小和日期属性来说很重要,它们很容易变异。然而,通过网络的往返使它变慢。
使用添加的DirectoryInfo.EnumerateXxxx()方法在.NET 4中解决了这个问题。强调一个枚举器现在很明显你得到了一个可能过时的文件信息副本。但是避免往返。
如果您可以使用.NET 4,请解决您的问题。如果您不能,则需要使用FindFirstFile,FindNextFile,FindClose。
答案 1 :(得分:2)
为了获得最佳性能,您可能希望使用Win32 API,例如FindFirstFile,FindNextFile,GetFileAttributesEx和GetFileSizeEx。
如果你想避免Win32调用,Directory.EnumerateFiles比Directory.GetFiles更有效,因为它在请求时懒惰地枚举文件,这可能在内部使用更高效的Win32 API。但是,由于您正在通过网络,您实际上可能希望调用Directory.GetFiles来立即获取它们。实验