2009-12-09 2 views
2

Когда я запускаю приведенный ниже код, он заполняет мой массив списком файлов в указанном каталоге.игнорировать файлы в полете

Это хорошо.

Однако он также захватывает файлы, которые находятся в полете, - это файлы, которые в настоящее время копируются в этот каталог.

Это плохо.

Как я могу проигнорировать эти «в полете» файлы? Есть ли способ проверить каждый файл, чтобы убедиться, что он «полностью там», прежде чем обрабатывать его?

string[] files = Directory.GetFiles(ConfigurationSettings.AppSettings.Get("sourcePath")); 
     if (files.Length > 0) 
     { 

      foreach (string filename in files) 
      { 
       string filenameonly = Path.GetFileName(filename); 
       AMPFileEntity afe = new AMPFileEntity(filenameonly); 
       afe.processFile(); 
      } 

     } 
+0

+1 Летающие файлы ... есть новый – MaLio

ответ

4

Да, вы можете попробовать открыть файл для записи. Если вы можете открывать для записи без исключения, скорее всего, это не «в полете». К сожалению, я столкнулся с этой проблемой несколько раз раньше и не нашел лучшего решения.

0

Попробуйте переименовать/переместить файл. Если вы можете переименовать его, он больше не используется.

+0

Он больше не использовался. В тот момент, когда переименование завершится, он может снова использоваться. Вы не можете управлять файловой системой :) – JaredPar

5

К сожалению, не существует способа достичь того, что вы ищете. предложение Роберта открытия файла для записи решает подмножество проблемы, но не решает большую проблему, которая

Файловая система лучше всего рассматривать как многопоточный объект, над которым у вас нет возможности синхронизации

Независимо от того, какую конструкцию синхронизации вы пытаетесь использовать, чтобы поместить файловую систему в «известное состояние», есть способ, по которой пользователь может ее побить.

Лучший способ подойти к этой проблеме - обработать файлы как обычно и уловить исключения, возникающие в результате использования файлов, находящихся в полете. Это единственный разумный способ работы с файловой системой.

+0

Это отличное объяснение. –

1
  1. Получить список файлов в каталоге.
  2. Получить список открытых ручек (см. Ниже).
  3. Удалите последний из первого.

Вы можете получить список открытых ручек с помощью p/invoking NtQuerySystemInformation. Там a project on CodeProject, который показывает, как это сделать. Кроме того, вы можете вызвать Handle.exe, из Sysinternals, и проанализировать его вывод.

0

Ответ Карры дал мне представление.

Если у вас есть доступ к программе, которая копирует файлы в этот каталог, изменить его так, что он:

  1. Записывает файлы во временную папку на том же диске.
  2. Переместить файлы в соответствующую папку после их записи на диск.

В той же файловой системе операция перемещения только обновляет записи каталога, а не изменяет физическое местоположение файла на диске. Это означает, что это очень быстро.

+0

Если вы хотите настоящую надежность, это все равно не сработает. Другие процессы на машине могут решить удалить эту новую папку по своему усмотрению. Вы не можете остановить это. Файловая система принципиально непредсказуема – JaredPar

Смежные вопросы