Синхронизация процесса путем обнаружения открытия файла (создание) - PullRequest
1 голос
/ 17 апреля 2009

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

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

Может возникнуть ситуация, когда файл находится в процессе записи, когда мое приложение пытается его обработать, что приводит к неполной обработке и / или другим ошибкам, поэтому мне нужно определить, полностью ли записан файл, ДО ТОГО, как я запускаю обрабатывая его.

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

Я мог бы сделать что-нибудь умное с наблюдателем файловой системы http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

Но я подозреваю, что есть элегантный способ, о котором я не думал для windows (NT и более поздние версии)

Ответы [ 6 ]

3 голосов
/ 17 апреля 2009

Я думаю, что ваше решение для системного наблюдателя через FileSystemWatcher или ReadDirectoryChanges - лучшее, что вы можете получить. Вы можете проверить этот учебник в CodeProject. Насколько более элегантным оно может стать?

2 голосов
/ 17 апреля 2009

Другой ответ, но другой: я вдруг вспомнил другой проект, который сделал нечто подобное. Мое приложение просто использовало OpenFile() с OF_SHARE_EXCLUSIVE (я думаю), пока оно успешно не открыло файл. В этом случае это работает нормально, потому что мое приложение получало доступ к файлу, записанному удаленным приложением, в общий ресурс на том же компьютере, что и мое приложение. Я никогда не проверял его с файлами на файловом сервере, но он может работать. Однако блокировка файлов не всегда надежна при использовании с удаленными файлами.

2 голосов
/ 17 апреля 2009

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

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

1 голос
/ 17 апреля 2009

В прежние времена мне приходилось писать программное обеспечение, которое взаимодействовало с использованием файлов в сети (между некоторыми приложениями * NIX и приложениями Windows через файловый сервер Novell). Чтобы сделать это надежно, мы всегда убеждали поставщика файлов данных создать дополнительный файл рукопожатия (просто пустой файл), когда он завершит запись данных. Наше приложение будет запрашивать файл рукопожатия, и если файл рукопожатия существует, мы читаем файл данных. Когда наше приложение завершит чтение данных, оно удалит файл рукопожатия. Файл рукопожатия отслеживался поставщиком, который не касался файла данных, пока существовал файл рукопожатия.

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

0 голосов
/ 17 апреля 2009

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

  • Напишите ваше приложение для постоянного запуска (как демон).
  • Проверьте файл и, если вы найдете его
    • контролировать его размер до тех пор, пока он не перестанет расти в течение определенного времени (например, 30 секунд)
    • переименуйте файл после того, как вы решили, что передача завершена
    • обработать переименованный файл
0 голосов
/ 17 апреля 2009

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

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