Сценарий (для принудительного удаления файла невозможно удалить при перезапуске):
- У меня есть файл, который открывается в какой-то программе, скажем, M.S. Слово. Могут быть и другие файлы, открытые в MS. Слово.
- В моей программе на С# мне нужно знать, какой процесс обращается к этому конкретному файлу, и мне нужно закрыть/освободить только этот конкретный файл из Word. Другие файлы трогать не следует, поэтому я не буду использовать метод Process.Kill().
Учитывая описанный выше сценарий, я сделал следующее:
Найден процесс (экземпляр класса Process), обращающийся к моему целевому файлу с помощью кода здесь< /а>
Найден список дескрипторов этого процесса (используя метод NtQuerySystemInformation()).
- Из списка дескрипторов я смог найти конкретный дескриптор, содержащий мой файл (используя метод NtQueryObject()). Пытался вызвать CloseHandle() для этого дескриптора, но это не сработало.
- Теперь я также могу перечислить все дескрипторы дочерних окон из моего целевого процесса.
Как мне найти этот конкретный дескриптор окна, связанный с дескриптором файла, который я нашел на шаге 3 выше? Мой план состоит в том, чтобы использовать метод SendMessage() с сообщением WM_CLOSE для этого конкретного окна, чтобы оно было закрыто, а мой файл был выпущен.
Один из способов — проверить строку имени файла в заголовке этого дочернего окна, а затем закрыть это окно. Но проблема в том, что файл с таким же именем мог быть открыт из другого места.