Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Как определить открыт ли файл, если да то чем...


Автор: RUVATA 14.1.2011, 19:24
Всем доброго времени суток...
Проблема казалось бы банальная...
Программе необходимо поработать с некоторым файлом, а он не всегда может быть доступен, т.е. он может быть занят, открыт другим приложением, или даже приложением другого пользователя (если файл доступен по сети)...
С этим в принципе можно разобраться, с помощью обработки исключений при инициализации экземпляра класса FileStream, пытаясь получить исключительную привилегию
Код

  Try
        Dim test As FileStream = File.Open("F:\Test.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.None)
        Catch ex As Exception
            If ex.TargetSite.Name = "WinIOError" Then MsgBox("файл занят другим приложением")
  End Try

 Как-то так...
Но вот как узнать каким... я уже и не говорю про "разблокировать"... хотя бы узнать каким...
Я уже 2 дня рыскаю в поисках ответа, и все в конце концов сводится к использованию API из "ntdll.dll", там "танцы с бубнами" чуть-ли не на accемблере надо выкручивать... опросчик открытых в системе файлов на 1000 строк кода... Sad
Неужели все так плохо ?
И в NetFramework нет ничего подходящего для получения подобного результата,
Ну не там, так через WMI как-нь-ть ?...
Need help!
Суть: Узнать/получить Handle известного открытого файла, определить какие процессы его юзают.

Автор: jonie 14.1.2011, 19:43
RUVATA, вам надо гуглить про NtQuerySystemInformation функцию из ntdll.dll а также про NtQueryInformationThread, NtQueryInformationProcess, NtQueryDirectoryObject ....

вот тут инфа имеется:
http://undocumented.ntinternals.net/

http://wj32.wordpress.com/2009/04/25/ntquerysysteminformation-a-simple-way-to-bypass-rootkits-which-hide-processes-by-hooking/


а вот нашел кой че готовое: http://www.codeproject.com/KB/shell/OpenedFileFinder.aspx
http://forum.sysinternals.com/topic18892.html
но вероятно придется допиливать.

Автор: RUVATA 15.1.2011, 16:04
Да, спасибо, но я же и говорю что все приводит у "танцам с бубнами" вокруг ntdll.dll
Конечно хочется понять суть... но проблема похоже совсем не тривиальная хотя и банальна на первый взгляд,
Потому я пошел другим путем, есть такая утилита от Windows SysInternals - Handle
С ее помощью как раз получается то что надь... но только на платформах WinNT
Windows Vista и Windows 7 ей уже не поддаются, потому вопрос по прежнему открыт,
 так как мое детище и на 7-ке работать должно.

Автор: jonie 16.1.2011, 14:48
unlocker теперь поддерживает коммандную строку. Пробуйте его ковырять, или ковыряйте ntdll.dll ....

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

http://s2.ipicture.ru/

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

http://s2.ipicture.ru/

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

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

http://s2.ipicture.ru/

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)