Есть папка с 8Гб мелких(1-5мб) файлов. Есть приложение, которое использует один из этих файлов. Мне нужно определить какой файл используется в данный момент.
Я вижу это, как постоянно прослушивание процесса и попытка отловить обращение к winApi на открытие файла.
Или перебирать все файлы с попыткой открыть для записи.
Оба варианта какие-то иррациональные. Может кто подскажет, как быть в моем случае?
Ответ
Тут есть несколько вариантов.
Получить список процессов, открывших файл, с помощью Restart Manager (пример), для каждого файла.
Распарсить вывод команды openfiles /query, которая выводит список всех открытых в данный момент файлов, и отфильтровать нужное (предварительно нужно включить вывод локальных файлов через команду openfiles /local on, и перезагрузить систему).
Как вы сказали, пытаться открывать файлы с параметром FileShare.None, и ловить исключения
Смотрите сами, по ситуации, что больше подходит. Все способы довольно тяжелые, если файлов много.
Примечание. Утилита openfiles (предположительно) использует для получения списка локально открытых файлов недокументированные возможности функции NtQuerySystemInformation и анализ внутренней структуры дескрипторов, поэтому реализовать самостоятельно эту же функциональность будет слишком трудно. (Пример решения на С++ с использованием своего драйвера.)
Комментариев нет:
Отправить комментарий