2015-06-30 6 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 
      }