![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
RUVATA |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 24.8.2010 Репутация: нет Всего: нет |
Всем доброго времени суток...
Честно уважаемые "дот.нетчики", пытаясь решить тривиальную задачу количество седых волос на моей голове вышло за пределы нуля и теперь неумолимыми темпами удваивается ![]() Суть... Программе выполняющей определенные манипуляции с файлами, перед тем как их выполнять необходимо убедиться что файл свободен и не занят иными приложениями, а в частности MS Excel, MS Office, 1С или Инфо-бухгалтер, а так-же, что оказалось вообще "фетиш" занят ли он / открыт ли по сети, соответсвенно теми-же приложениями... Это как бы минимум требований, а желаемо еще бы определить каким процессом если локально, или какой учеткой если по сети он юзается... Ну и в идеале иметь определенный инструментарий, который вооружившись правами админа мог бы грубо эти ресурсы высвобождать. 1) Сперва попробовали въехать в то ка-же вообще определить используется ли известный файл вообще думали здесь, и на нескольких других форумах посвященным программированию в среде .NET, но ничего толкового не надумали, самопоиск и советы на вашем форуме свелись к "танцам с бубном" вокруг API NtQuerySystemInformation из ntdll.dll вот здесь и здесь можно понять какой это "кровоточащий геморрой" ... ну только если файл вообще процессом заблокирован Уровень внешнего доступа "None", то сам факт использования определяем обрабатывая исключение WinIOerror пытаясь получить исключительную привилегию на файл.
... Этого мало, как узнать каким ? Но вот казалось выход замячил... можно же юзать и стороннюю утилитку, н/п Unlocker(консольный) или Handle.exe от SysInternals мануал которого гордо гласит, Detected all used handle's in the tagert dirrectory with there process, pid, memory... (ни хрена подобного!!!) вот вам пример использования handle.exe
Парсим HandleText, он метаморфозирует кому как нравится, я например класс-описатель соорудил для каждого (файл, процесс, пид) Да только толку мало... работает если только файл юзается не системными процессами, т.е. явно локально запущенными программами не относящимися к сервисам и службам системы, все файлы которые дрочит System и сеть ни хрена не беруться в расчет... Зато их охеренно чует 7-zip который нам черным по белому мессажит: "Файл занят другим процессом!", а ни Handle.exe ни приславутый Unlocker не чують на той-же директории подвоха. Полное фиаско! Ладно, что-то где-то проскакивало про WMI, я тогда еще не представлял какая брешь седины у меня образуется... Кое как криком боком, научились юзать WMI, даже чуть въехали в структуру классов, базовые методы, как шаманить над коллекциями вот мы уже можте вычленить список процессов, получить их Handle-Ы, и толку... вот кстати пример
не забыть установить у проекта ссылку на System.Management !!! Imports не достаточно, по крайней мере для Visual Studio 2010 .... В многих местах упоминается что при помощи класcа "root\CIMV2" Win32_Directory мы можем получить ту самую вымученную инфу о занятом файле... но нигде не описано как, не говоря уж о примере кода... Лично я не догоняю так как свойств и методов пригодных для этого я у него не нашел, разве что свойство InUseCount но если я еще понимаю вражеский то: The InUseCount property is an integer indicating the number of 'file opens' that are currently active against the file. это лишь общее количество занятых файлов... а как подобраться к их качеству? Теперь я устремил свой взор в строну GDT(Global Discriptors Table) и LDT(Local Descriptors Table) В итоге проблема до сих пор в подвешенном состоянии... несмотря на титанические усилия... но либо я не там копаю... либо это реально сложная задача! Уважаемы знатоки ! ![]() 1)Зная Handle/ID или PID процесса, можно ли подобраться ко всем его ресурсам средствами vb.NET ... а именно к другим его дескрипторам описывающим занятые файлы, пробраться к его LDT ? как говорит MSDN там тоже такую инфу можно найти! 2)Чем отличаются файлы занятые по сети от файлов занятыз локальными процессами, и почему гребанный архиватор может определить что файл занят, а специальные утилиты нет ? 3) Что мне курить, колоть, или пить дальше ? ![]() |
||||||
|
|||||||
m0nax |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 24.6.2010 Репутация: нет Всего: нет |
C помощью апишных функций можно получить список всех хендлов и PIDов
Из этого списка не сложно рассортировать какие хандлы в каких процессах Сами хендлы можно получить с помощью NtQuerySystemInformation Что бы определить файлы придется получать их имена по хендлам, прежде чем это делать придется узнать тип хендла и убедиться что хватает прав на общение с ним значит нужен DuplicateHandle(для доступа) и NtQueryObject Само имя можно определить тем же NtQueryObject, там будут не совсем те имена которые мы привыкли видеть (\\systemroot или 1\\device вместо С:\ и D:\) чтоб получить в адекватном виде путь/имя нужно кой чего сделать, но это уже детали ) Вот собственно класс, который позволяет получить список файлов используемых процессом конечно же на С# ибо вб знать не знаю
если кто найдет какие корявости и исправит не забудьте поделиться, ибо я пользуюсь классом Это сообщение отредактировал(а) m0nax - 30.1.2011, 14:03 |
|||
|
||||
RUVATA |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 24.8.2010 Репутация: нет Всего: нет |
мать моя женьщина
![]() конечно можно и так... may be а вообще-то вот http://forum.vingrad.ru/act-ST/f-404/t-320169.html я там последним постом открыл тайну миру ![]() |
|||
|
||||
svm1977 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 24.10.2011 Репутация: нет Всего: нет |
m0nax, а можно поподробнее о вашем классе, который позволяет получить список файлов используемых процессом.
Какие функции надо вызывать из кода? Пробовал этот класс, он рабочий, но создаёт незавершаемые потоки с утечками памяти, не могу побороть. Ваш класс похож, но реализация немного другая. |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | .NET для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |