2008-12-05 9 views
2

Я пишу приложение, которое отслеживает каталог для новых входных файлов, опросив каталог каждые несколько секунд. Новые файлы могут часто составлять несколько мегабайт, поэтому потребуется некоторое время, чтобы полностью войти в каталог ввода (например: при копировании с удаленного ресурса).Определить файл в пути?

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

Я уже рассмотрел возможность перебора двух каталогов separaetd на несколько секунд и сравнения размеров файлов, но это вводит компромисс между временем и надежностью, что мои начальники недовольны, если нет альтернативы.

Для фона, приложение записывается в виде набора Matlab M-файлы, так что нет JRE/CLR трюки я боюсь ...


Edit: файлы не прибывают в ввод непосредственно посредством операции прямого перемещения/копирования, либо с сетевого диска, либо из другого места в локальной файловой системе. Эта операция копирования, вероятно, будет инициирована пользователем, а не другим приложением.

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


Заключение: кажется, что не существует простой способ чтобы сделать это, поэтому я остановился на подход ремня и противовесов брекетов - файл готов для обработки, если:

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

Спасибо всем за их ответы!

ответ

3

Это проблема промежуточного слоя, такая же старая, как и холмы, а короткий ответ: нет.

Два «решения» ставят бремя на файл-загрузчик: (1) загружают файл в промежуточном каталоге, а затем перемещают его в целевой каталог (2) загружают файл, а затем создают/готовый "файл, который указывает состояние файла содержимого.

Первый - лучший, но оба являются неэлегантными. По правде говоря, лучшие коммуникационные средства существуют, чем файловая система. Подумайте об использовании некоторых IPC, которые включают только push или pull (а не оба, как и файловая система), такие как HTTP POST, JMS или MSMQ очередь и т. Д. Кроме того, это также может быть синхронным, позволяя процессу получать файл чтобы подтвердить содержание, даже проверить его на предмет достоинства и вручить клиенту квитанцию ​​- это праведный путь к отказу от ответственности. Следуйте этому, и вы никогда не будете терпеть аргументы в отношении того, был ли файл был или не был доставлен на ваш сервер для обработки.

M.

+1

Почти через год после моего первоначального поста я все больше приближаюсь к написанию бумаги под названием «FTP считается вредным». Я вижу, что анти-шаблон «сообщение большими файлами по FTP» во многих так называемых «корпоративных» магазинах положительно тревожит меня. Я уверен, что он возвращается к эпохе, когда связь между приложениями осуществлялась путем переноса ленты между машинами, и что никто еще не оспаривал крики «Мы всегда так делали». – 2010-09-29 12:56:07

7

Самый безопасный способ состоит в том, чтобы приложения (приложения), которые помещали файлы в каталог, сначала помещали их в другую временную директорию, а затем переводили их в реальную (которая должна быть атомной операцией даже при использовании FTP или файлов). Вы также можете использовать соглашения об именах для достижения одного и того же результата в одном каталоге.

Редактировать: Это действительно зависит от файловой системы от того, имеет ли ее функциональность копирования даже концепцию «завершенного файла». Я плохо знаю протокол SMB, но если у него есть эта концепция, вы можете написать приложение, которое предоставляет интерфейс SMB (или патч Samba) и API для получения уведомлений о завершенных копиях файлов. Наверное, много работы.

1

Одной из простых возможностей было бы опрос на довольно большом интервале (от 2 до 5 минут) и только подтверждение нового файла во второй раз, когда вы его увидите.

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

1

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

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

В качестве альтернативы вы можете использовать модифицированное время для файла - файл должен быть новым и иметь модифицированное время, которое по меньшей мере равно x в прошлом. Но я думаю, что это будет примерно эквивалентно кэшированию листинга.

Это вы опросили папку каждые несколько секунд, это не так много времени штраф? А его платформа агностик.

Кроме того, Linux только: http://www.linux.com/feature/144666

Как хрон, но и для файлов. Не знаете, как это связано с вашей конкретной проблемой - но может быть полезно?

0

Какая у вас ОС. В unix вы можете использовать утилиту lsof для определения, есть ли у пользователя файл для записи. По-видимому, где-то в MS Windows Process Explorer есть те же функции.

Альтернативно, вы можете просто попробовать эксклюзивный открытый файл, и это не поможет. Но это может быть немного ненадежным, и его легко наступать на собственные пальцы.