Windows - открытие файла из кода и ожидание его закрытия - PullRequest
0 голосов
/ 21 сентября 2019

Мне нужна помощь и / или совет, пожалуйста.

Я открываю файл из кода либо в связанной с ним программе Windows по умолчанию, либо с помощью выбранной программы Windows, используя либо ShellExecute, либо CreateProcess.Затем я жду, пока процесс завершится.Но это на самом деле не работает для меня, потому что:

Скажем, по умолчанию связанная программа для текстовых файлов (* .txt) - Notepad ++ (NPP).Чтобы процесс завершился, АЭС не должна быть открыта для запуска и должна быть закрыта для завершения процесса.

Но если АЭС уже открыта, файл будет открыт в уже открытой АЭС.Но я не обязательно хочу закрыть NPP, чтобы завершить процесс, я просто хочу закрыть открытый текстовый файл и должен определить, что файл закрыт, а не NPP.

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

Итак, мой вопрос: какой метод лучше всего определить, когда файлоткрыт или используется и наоборот?

1 Ответ

2 голосов
/ 21 сентября 2019

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

Ваш вопрос тесно связан с этим вопросом .Вы можете сослаться на это, чтобы периодически опрашивать дескриптор процесса, чтобы увидеть, какие файлы открыты.Будут проблемы с синхронизацией - процесс может сначала занять несколько секунд, чтобы открыть файл.

Существуют также такие инструменты, как Handle.exe , которые могут быть полезны.

Однако - ни одно из этих решений не является идеальным.Некоторые приложения, в том числе Notepad.exe, просто открывают файл, читают содержимое и сразу же закрывают ручку.Когда пользователь нажимает «сохранить», файл повторно открывается для записи, содержимое сохраняется на диск, а затем дескриптор файла снова закрывается.

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

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