Обнаружить файл в пути? - PullRequest
       10

Обнаружить файл в пути?

2 голосов
/ 05 декабря 2008

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

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

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

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


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

В результате довольно сложно возложить на поставщика файлов ответственность за добавление файлов управления или использование промежуточной промежуточной области ...


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

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

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

Ответы [ 5 ]

7 голосов
/ 05 декабря 2008

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

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

3 голосов
/ 05 декабря 2008

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

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

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

М.

1 голос
/ 05 декабря 2008

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

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

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

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

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

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

1 голос
/ 05 декабря 2008

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

Я не знаю, как в какой-либо операционной системе определить, копируется ли файл по-прежнему, кроме проверки, не заблокирован ли файл.

0 голосов
/ 05 декабря 2008

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

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

...