2015-06-30 32 views
1

我需要每天复制来自网络驱动器的文件。为了做到这一点我已经试过如下:GetFiles在网络驱动器上速度太慢

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

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

因为整个硬盘有成千上万的文件的程序不会在一段时期有用做任何事情。

我的替代品是什么?

+0

您是否尝试过PowerShell的获得孩子的功能,你可以做一些非常好的东西在限制数据集,包括日期,“喜欢”等 –

+0

你总是可以多线程(一个线程搜索每个不同的“第一个孩子(目录)“的Z:/)。 – User999999

+0

@Anthony Horne还没有,我在看像xcopy和robocopy这样的东西 – celsoap7

回答

2

的GetFiles返回的所有文件与你开始进行筛选之前开始,

您可以使用EnumerateFiles这是懒惰的,并让您链中的地方查询。您还可以在特定的文件类型从上面的链接过滤

报价

的EnumerateFiles和GetFiles的方法的区别如下:

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

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

您也可能会更好在一个单独的线程执行此操作,这样你就不会阻止你的主应用程序线程,虽然这将取决于什么其他的应用程序是专门做(仍可能值得,所以你可以阻止它认为它没有响应)。

+2

注意:我没有试过这个,但是你可以使用'* A300 *。*'滤镜模式来匹配你的文件名包含 – Sayse

+1

那个过滤器做成了巨大的差异 – celsoap7

+0

@ celsoap7 - 太棒了!听到那个消息很开心 :) – Sayse

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 
      }