Я работаю над программой, которая обрабатывает файлы изображений. Проблема, с которой я сталкиваюсь, заключается в том, что некоторые изображения очень большие, и я не знаю, когда будет завершен процесс копирования. Прямо сейчас код написан на C # и использует класс FileSystemWatcher для мониторинга файлов. Единственная проблема заключается в том, что нет никакого события, когда другой процесс завершен с файлом.
Текущая логика состоит в том, чтобы отслеживать созданные и измененные события, а затем ждать 5 секунд в надежде, что к этому моменту процесс копирования завершится. Хотя это работает на моей машине для разработки, к сожалению, клиенты сообщают о проблемах всего процесса.
Несколько лет назад, когда я писал этот код, я видел, что на более низком уровне, я думаю, что он был частью DDK SDK или чего-то подобного, можно узнать гораздо больше информации о том, как другая программа обращается к файлу.
Кто-нибудь может говорить об этом и указать мне правильное направление? Я ожидаю, что это будет код C ++, а не код C #.
Чтобы ответить на несколько вопросов ниже:
Проблема в том, что ДРУГИЕ процессы копируют изображения в каталоги, которые отслеживает моя программа. Как только изображения полностью скопированы, моя программа должна начать обработку изображений как можно скорее. Проблема заключается в том, что многие изображения, иногда сотни изображений, будут скопированы за один раз. Поскольку каждое изображение должно обрабатываться как можно быстрее, система должна знать как можно скорее, что изображение полностью скопировано и может быть обработано.
Я полностью осознаю, что НЕТ никакого способа сделать то, что я хочу сделать через WinSDK, но я на 99.9% уверен, что это возможно через WinDDK, возможно, у меня неправильное имя, я прогуглил это и получил «Windows Driver Kit (WDK»). )». Я уверен, что SysInternals справляется со всеми своими хитростями с помощью функций уровня WDK.
Что вас может заинтересовать, так это инструмент sys internals procmon. Помимо других функций, он контролирует доступ к файлам, предоставляя вам множество деталей.
К сожалению, источники не доступны, но вот ветка о предыдущей версии (filemon), начатый кем-то с проблемой, похожей на вашу.
Также вы можете посмотреть в альтернатива с открытым исходным кодом, он может иметь код, который вы ищете.
В качестве альтернативы вы можете использовать ProcMon в качестве инструмента мониторинга и проанализировать его вывод. Используя встроенный фильтр, вы сможете ограничить записи в файле журнала определенной папкой и типом / данными события доступа к файлу.
Недавно у меня была возможность вернуться к этой проблеме для одного из моих проектов, и я обнаружил, что
File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None)
вызовет IOException, если файл все еще используется другим процессом.
Итак, что вы можете сделать, это после того, как вы получите уведомление Created от FileSystemWatcher, вызовите File.Open каждые пару секунд, как только вы перестанете получать исключение, вы узнаете, что с файлом выполняется другой процесс.
Других решений пока нет …