Вопрос

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

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

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

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


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

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


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

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

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

Это было полезно?

Решение

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

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

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

M.

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top