2017-02-16 22 views
0

У меня есть папка, которая просматривается службой с FileSystemWatcher, и я использовал этот Answer, чтобы помочь мне записать большие файлы.Как бороться с быстрым последовательным созданием файла в папке, просматриваемой файловой системой?

Тем не менее, я пришел к вопросу, если есть последовательные создания файлов около (100 МБ или более).

Вопрос: Как я могу решить эту проблему? Пример около 10 файлов (по 100 МБ каждый), записанных в мою папку.

Примечание: Доступ к этой папке осуществляется через мою сеть. Могут быть файлы, созданные, но не полностью завершенные/завершенные. FileSystemWatcher может обрабатывать файл без его полного написания.

Текущий код для проверки, если при открытии файла Выдает исключение

private static bool IsFileLocked(FileInfo file) 
    { 
     FileStream stream = null; 
     try 
     { 
      stream = file.Open(FileMode.Open, 
        FileAccess.Read, FileShare.None); 
     } 
     catch (IOException) 
     { 
      //the file is unavailable because it is: 
      //still being written to 
      //or being processed by another thread 
      //or does not exist (has already been processed) 
      return true; 
     } 
     finally 
     { 
      if (stream != null) 
       stream.Close(); 
     } 

     //file is not locked 
     return false; 
    } 

Текущая проверка, если есть файл, созданный код.

private void FSWatcher_Created(object sender, System.IO.FileSystemEventArgs e) 
    { 
     var files = getFiles(FSWatcher.Path); //stores all filenames in the directory in a list 
     if (files.Count() > 0) 
     { 
      foreach (string file in files) 
      { 
       FileInfo file_info = new FileInfo(file); 
       while (IsFileLocked(file_info)) 
       { 
        Thread.Sleep(5000); //Sleep if file unavailable 
       } 
       //code to process the file 
      } 
      //some code here 
     } 
    } 

ответ

0

Как я уже обработаны смотреть папки в прошлом использовали опрос вместо FileSystemWatcher, its not 100% reliable anyway

Процессор я сделал петлю через каждый файл и попытался переместить их в папку «Processing» первым. Перемещение будет (возможно, *) успешным только в том случае, если файл закончил писать, и, как только перемещение завершится, поток, который его перемещает, может безопасно инициировать обработку этого файла (например, в новом потоке). Обратите внимание, что файл можно перемещать только один раз, что означает, что вы случайно не можете использовать два разных потока для обработки файла одновременно.

*: Его возможное (но редкое) приложение для создания файла, который можно перемещать, пока он еще открыт