Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Определить открыт ли файл, и если да то каким процессом... (http://forum.oszone.net/showthread.php?t=196976)

RUVATA 18-01-2011 19:22 1591644

Определить открыт ли файл, и если да то каким процессом...
 
Всем доброго времени суток...
Долго бился головой об стенку, малую часть из моих "потуг" можно посмотреть здесь
Результат все такой-же нулевой, то что Java на *.nix делает 6-ю строками... в Windows судя по всему целая эпопея.
Устал от "танцев с бубном" хочу учиться... а для этого желаю понять все таки - руководствуясь какой логикой необходимо
мою проблему решать, а уже потом искать ее реализацию в каком-либо языке/технологии (Vb.net :) желательно конечно, но нет так нет)

Хочу понять как в Windows процессы используют файлы, и как можно получить подобного рода сведения...
т.е что необходимо знать о файле или процессе, или и о том и о другом, чтобы получить связку "процесс использует файл"
"ресурсы процесса" - что это, с чем его едят
"дескрипторы" аналогично...
почему 7-zip пишет "Заблокирован" а Unlocker или Handle.exe ничего не чуют на одном и том-же файле.
ID/PID/Handle, LDT, GDT, я запутался... WMI - вообще привело к преждевременной седине, добрался аш, до CIM_DataFile.InUseCount на который было столько надежд - и ничего опять не выходит.

Дайте пинка в нужном направлении...
На любом языке пример кода...

Я прям не верю, что никак нельзя вооружившись определенными привелегиями - спросить систему "Используется ли вот этот файл, и если да, то кем?"

Admiral 18-01-2011 22:47 1591794

RUVATA если с файла нужно просто извлечь информацию не обязательно ведь устанавливать кем он открыт http://www.wasm.ru/article.php?article=lockfileswork
Методы могут не работать на Висте и выше.

RUVATA 19-01-2011 12:04 1592183

Цитата:

Цитата Admiral
если с файла нужно просто извлечь информацию »

А если нет...
вот в лично моем случае, необходимо произвести изменения файла, перед которыми по всей логике необходимо сделать "бэкап"
архив, или копию, но ни то ни другое не получится если файл занят... тогда надо понять кем\чем занят...

Да и не суть, моя проблема банальный вопрос как?
как в Windows программно определить занят ли и кем занят процесс... ?
Кто ни будь может мне логически объяснить что мне для этого надо...
хотя бы логику...

Admiral 19-01-2011 19:33 1592524

RUVATA, я бы начал тогда изучать как Explorer детектить данный вопрос http://paulkravchenko.wordpress.com/...а-file-in-use/
А в помощники бы взял ApiMonitor дабы выяснить, как именно детектится. Возможно для ХР и Висты кое-что придется дописывать, так как каким процессом занят файл сообщает только Севен.
Ещё стоит обратить внимание на Foxit Reader он репортирует систему (даже ХР) об открытых своих файлах.
Ещё как вариант http://paulkravchenko.wordpress.com/...-ресурсов-для/ может его удастся задействовать программно (но опять не во всех ОС).

RUVATA 20-01-2011 09:16 1592875

Admiral,
Разрешите вопрос:
vb.NET располагает такой функцией как DublicateHandle
а именно описание этой функции выглядит следующим образом:
'The DuplicateHandle function creates a duplicate handle. The returned duplicate is in the caller's process space. '
Т.е. Функция DuplicateHandle копирует "ресурсы" процесса, таблицу его дескрипторов...
И теперь располагая копией стало быть можно просмотреть эти самые ресурсы... но че-то не у класса Handle, не у Process который тоже можно Dublicate
я не могу найти подходящих свойств или методов...
может кто подскажет ? или я вообще не в том направлении пошел

RUVATA 20-01-2011 10:50 1592930

Вложений: 3
А ларчик-то очень просто открывался...
Вопрос поднимался на нескольких форумах посвященных программированию и администрированию,
и никто ни где так и не дал правильного ответа на вопрос "Как определить Используется ли вот этот файл, и если да, то кем?"
а вот вам и ответ...
и не надо блукать вокруг Windows API, копировать Handles, и иными способами извращаться...
так как Microsoft предусмотрительно начиная с версий NT, в составе системных утилит предоставляет нам openfiles.exe
которая банально уже из самого названия понятно, предназначена для предоставления информации об OPENFILES



Данная утилита определяет привилегии запустившего ее пользователя, достаточные или нет для получения такой информации.
и по запросу с аргументом \Query (по умолчанию, можно аргумент опустить) выдает нам все что мы так жаждали увидеть.
В изначальном состоянии данная утилита находится в режиме отображения информации исключительно об открытых по сети файлов...
но изменив значения флага \Local отвечающего за "построение списка объектов" ...



... и изменить его используя аргумент /Local on
параметры вступят в силу после перезагрузки системы...

вуаля! ... обращаемся к openfiles.exe.. и с ее StandartOutput
снимаем таблицу следующего содержания


Iska 20-01-2011 11:46 1592967

Цитата:

Цитата RUVATA
так как Microsoft предусмотрительно еще с версий 9x, в составе системных утилит предоставляет нам openfiles.exe »

Откуда такая информация?

RUVATA 21-01-2011 12:09 1593819

Цитата:

Цитата Iska
Откуда такая информация? »

упс... уже исправляюсь
действительно openfiles.exe входит в список утилит которые появляются только в NT, приношу извинения...
... по моему я це вычитал на sysadmins.ru попробую отыскать пост.

Iska 10-02-2011 05:35 1609007

Цитата:

Цитата RUVATA
действительно openfiles.exe входит в список утилит которые появляются только в NT »

RUVATA, снова — откуда и эта информация?! «openfiles.exe» наличествует, начиная с Windows XP.

Во всех версиях NT таких утилит нет. Лишь в «Microsoft Windows 2000 Resource Kit» появляется техническая утилита «Oh.exe: Open Handles» с близким функционалом:
Цитата:

Код:

C:\Temp>oh.exe /?
Usage: OH [-p n] [-t typeName] [-o fileName] [-a] [name]
where: -p n - displays only open handles for process with ClientId of n
      -t typeName - displays only open object names of specified type.
      -o fileName - specifies the name of the file to write the output to.
      -a includes objects with no name.
      name - displays only handles that contain the specified name.




Время: 13:56.

Время: 13:56.
© OSzone.net 2001-