![]() |
Получение списка хендлов к файлу
Как через Win32 узнать, есть ли открытые хендлы у файла? Хочется узнать, получится ли удалить файл, не производя собственно попытки его стереть.
|
Обязательно самому писать? Если нет, советую:
http://www.sysinternals.com/ntw2k/freeware/handle.shtml Ну и это можно посмотреть: http://www.sysinternals.com/ntw2k/source/filemon.shtml |
Handle выдаёт неполные данные. Возьмём, к примеру, nnCron. У него в составе библиотека есть, которая, очевидно, отвечает за отображение контекстного меню, — nnhook.dll. Если в сеансе работы вызвать контекстное меню, то до перезагрузки этот файл удалить невозможно. Но Handle никаких данных о хендлах к нему не выдаёт. Или я что-то недопонимаю здесь просто?
|
Raistlin
Цитата:
Ведь насколько я понял,под "открытым файлом" ты подразумеваешь некоторый запущенный исполняемый файл (.exe)... :huh: |
Цитата:
|
А попробуй его открыть — Exclusive... (for r/w and w/o sharing flags)
Я так проверяю в аналогичной ситуации. |
Raistlin
Теперь я вроде понял,что ты имеешь в виду (невозможность удаления библиотеки пока не перезагрузишь систему). Значит,функция EnumProcessModules лишь перечисляет все модули,загруженные в адресное пространство конкретного процесса. В твоём же случае необходимо,на мой взгляд,смотреть атрибуты файла, т.е. возможно,что у этой библиотеки выставлен атрибут FILE_ATTRIBUTE_READONLY ,который означает,что приложения не могут ни писать в этот файл,ни удалять его. К примеру: Код:
var P.S. Если тебе всё-таки понадобится пример кода функции EnumProcessModules,напиши - приведём :) . |
Я воспользовался советом SergeCpp, вроде получилось:
Код:
CreateFile(filename, GENERIC_WRITE, 1, 0, OPEN_EXISTING, 0, 0) |
А спасибо...
Ладно уж, я так, к слову... |
Прощу прощения! Конечно, большое спасибо. Я долго раздумывал, писать такое неинформативное сообщение или нет :), решил — не буду, так как в предыдущем посте я поблагодарил заранее. Надеюсь, ты меня простишь :sorry:.
А вот и кое-что по теме. Похоже, проверить каталог на залоченность таким образом нельзя: Код:
CreateFile(dirname, GENERIC_WRITE, 1, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0) |
Ага, здесь как раз может помочь Handle. Правда, есть одна проблема: он рассматривает хендлы только к реальным каталогам — символических связей не понимает. Есть ли способ узнать реальный путь, на который указывает символическая связь?
|
Там надо поколдовать с SHARING'ами при открытии каталога,
так как это не обычный файл (ну да, обычный, но не совсем) Посмотри в MSDN... И о Symbolic Link & Hard Link... P.S. Насчёт "заранее спасибо" мягко говоря, это не совсем... про это есть даже статья в "Elements of Style" |
Точно! Не тот флаг выставлял. Вот итоговые варианты:
Код:
CreateFile(filename, GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0) |
Важная ремарка: если файл имеет атрибут read-only, открыть его эксклюзивно на запись тоже не получится. Надо снимать атрибут, открывать файл, потом снова устанавливать атрибут.
|
Время: 22:38. |
Время: 22:38.
© OSzone.net 2001-