2013-10-25 3 views
0

Я пытаюсь рассчитать общий размер всех файлов, в которых последнее время записи находится раньше, чем через 10 минут в указанном каталоге , который имеет большую сумму данных. Здесь идет код я попытался ниже:Ошибка System.IO.IOException при попытке получить имена файлов

DateTime from_date = DateTime.Now.AddMinutes(-10); 
List<string> list = Directory.GetFiles(@[PATH], "*", SearchOption.AllDirectories)    
      .Where(x => File.GetLastWriteTime(x).Date > from_date) 
      .Select(x => new FileInfo(x).FullName) 
      .ToList();    

foreach (String s in list) 
{ 
    FileInfo file = new FileInfo(s); 
    size += file.Length; 
} 

button6.Text = ((size/1024f)/1024f) + "MB"; 

Это работает, когда я указать путь местного, но бросает мне сетевое имя больше не доступно IOException при указании сетевого пути. Почему это происходит? Есть ли способ, по которому я могу «удерживать» сетевой путь или убедиться, что соединение с этим путем не сработает?

+0

Звучит как странная сетевая проблема для меня. Файловый сервер отключается, логин истекло. Поговорите с администратором локальной сети. Всегда используйте гораздо лучший метод DirectoryInfo.EnumerateFiles() в .NET 4.0. –

+0

@HansPassant Почему DirectoryInfo.EnumerateFiles() намного лучше? В чем разница? Смогу ли я использовать что-то близкое к SearchOption.AllDirectories на нем? – cgalvao1993

+1

Он не совершает круговые поездки туда и обратно на сервер. Таким образом, это * много быстрее, вы можете использовать это, если ваша сеть нестабильна. Каталог DirectoryInfo.EnumerateDirectories имеет параметр AllDirectories. Кстати, похоже, что вы действительно должны использовать FileSystemWatcher. –

ответ

0

DirectoryInfo.EnumerateFiles() и DirectoryInfo.EnumerateDirectories - лучший вариант.

IEnumerable<DirectoryInfo> directories = new DirectoryInfo(root).EnumerateDirectories().OrderByDescending(d => d.Name); 
IEnumerable<FileInfo> files; 

      foreach (DirectoryInfo directoryInfo in directories) 
      { 
       files = directoryInfo.EnumerateFiles("*" + extension, SearchOption.AllDirectories).OrderByDescending(f => f.LastWriteTime); 
       foreach (FileInfo f in files) 
       { 
        if ((f.LastWriteTime.CompareTo(DateTime.Now.AddMinutes(-10)) == 1) 
         //Do whatever you want with the files 
       } 
      } 
Смежные вопросы