Сценарий (за принудително изтриване на файл, не може да отиде за изтриване при рестартиране):
- Имам файл, който се отваря в някаква програма, да речем M.S. Слово. Може да има и други файлове, отворени в M.S. Слово.
- В моята C# програма трябва да знам кой процес има достъп до този конкретен файл и трябва да затворя/освободя само този конкретен файл от Word. Други файлове не трябва да се нарушават, така че няма да използвам метода Process.Kill().
Като се има предвид горният сценарий, направих следното:
Намерих процеса (екземпляр на клас Process), който осъществява достъп до целевия ми файл с помощта на кода тук
Намерих списък с манипулатори, държани от този процес (с помощта на метода NtQuerySystemInformation()).
- От списъка с манипулатори успях да намеря конкретния манипулатор, който държи моя файл (използвайки метода NtQueryObject(). Опитах се да извикам CloseHandle() на този манипулатор, но това не работи.
- Сега мога също така да изброя всички дъщерни манипулатори на прозорци от моя целеви процес.
Как да намеря този конкретен манипулатор на прозореца, който е свързан с манипулатора на файла, който намерих в стъпка 3 по-горе? Моят план е да използвам метода SendMessage() със съобщение WM_CLOSE към този конкретен прозорец, така че да бъде затворен и файлът ми да бъде освободен.
Един от начините е да проверите низа на името на файла в заглавието на този дъщерен прозорец и след това да затворите този прозорец. Но проблемът е, че файл със същото име може да е бил отворен от друго място.