GetFiles在网络驱动器上太慢

时间:2015-06-30 09:09:30

标签: c# directory-structure

我需要每天复制网络驱动器中的文件。为此,我尝试了以下方法:

    var dir = new DirectoryInfo(@"Z:\");

    var filesA300 = dir.GetFiles().Where(x => x.FullName.Contains("A300") 
&& x.LastWriteTime.Date == DateTime.Now.Date).ToList();

由于驱动器有数千个文件,因此程序在有用的时间内不会执行任何操作。

我的替代方案是什么?

2 个答案:

答案 0 :(得分:2)

GetFiles在开始过滤之前返回所有要开始的文件,

您可以使用更为懒惰的EnumerateFiles,并允许您将查询链接到哪里。您还可以筛选特定文件类型

从以上链接引用

  

EnumerateFiles和GetFiles方法的区别如下:

     
      
  • 使用EnumerateFiles时,可以在返回整个集合之前开始枚举FileInfo对象的集合。

  •   
  • 使用GetFiles时,必须等待返回整个FileInfo对象数组,然后才能访问该数组。

  •   

您可能最好在单独的线程上执行此操作,这样您就不会阻止主应用程序线程,尽管这取决于应用程序设计的其他内容(仍然可能值得,因此您可以停止它认为它没有反应)。

答案 1 :(得分:1)

您可以先对文件信息进行枚举,然后只获得您想要的内容。

var myFilesToProcessInfos =  new DirectoryInfo("your location").EnumerateFileSystemInfos("*", SearchOption.TopDirectoryOnly).Where(x=>x.Name.Contains("Your pattern") /*&& x.CreationTime == your pattern*/);
            foreach (FileInfo fInfo in myFilesToProcessInfos)
            {
                // do your stuff
            }