Почему OS X не блокирует файлы, как Windows, при копировании на общий ресурс Samba? - PullRequest
2 голосов
/ 03 апреля 2012

У меня есть проект, который использует .net FileSystemWatcher для просмотра общего ресурса Samba для видеофайлов. Когда он видит файл, он добавляет его в очередь кодирования. Когда файлы сняты с производства, они перемещаются в локальный каталог, где процесс затем кодирует файл в несколько различных форматов и выплевывает их в выходной каталог.

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

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

Итак, мой вопрос, есть ли способ заставить FileSystemWatcher ждать полной записи файлов, прежде чем запускать событие «Создано» (на основе этот вопрос Я думаю, что ответ на этот вопрос " нет ")? В качестве альтернативы, есть ли способ получить файлы, скопированные из OS X, чтобы вести себя так же, как в Windows? Или мне нужно найти другое решение для просмотра общего доступа к Samba? Спасибо за любую помощь.

1 Ответ

0 голосов
/ 03 апреля 2012

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

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

Любой файл, который не изменялся в течение некоторого "достаточно длительного" периода времени (1 с? 5 с?), Считается "выполненным".

Как только у вас будет готовый файл, переместите / переименуйте этот файл в другой каталог. Именно из ЭТОГО каталога ваш процесс загрузки может быть запущен. Он «знает», что в этом каталоге находятся только полные файлы.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...