Как определить, открыт ли какой-либо файл в Windows?

Один из моих любимых инструментов для Linux - lsof - настоящий швейцарский армейский нож!

Сегодня мне стало интересно, какие программы в WinXP-системе имеют определенный файл. Есть ли эквивалентная утилита для lsof? Кроме того, этот файл был связан с сетевым ресурсом, поэтому я не уверен, что это осложняет ситуацию.

Ответ 1

Используйте Process Explorer из Sysinternals Suite, функции Find Handle или DLL, которая позволит вам искать процесс с помощью этот файл открыт.

Ответ 2

Эквивалент lsof -p pid - это комбинированный вывод из дескриптора sysinternals и listdll, т.е.

handle -p pid
listdlls -p pid

вы можете узнать pid с sysinternals pslist.

Ответ 3

Попробуйте Обработать. Filemon и Regmon также отлично подходят для выяснения того, что программа duce foo делает вашу систему.

Ответ 4

Попробуйте Unlocker.

У сайта Unlocker есть отличная диаграмма (прокрутка вниз после ссылки), которая показывает сравнение с другими инструментами. Очевидно, что такие сравнения обычно предвзяты, поскольку они, как правило, пишутся автором инструмента, но в таблице, по крайней мере, перечислены альтернативы, чтобы вы могли попробовать их для себя.

Ответ 5

Если файл является .dll, вы можете использовать приложение командной строки TaskList, чтобы узнать, чей доступ он открыт:

TaskList /M nameof.dll

Ответ 6

Один эквивалент lsof может быть объединен с выходом из дескриптора Sysinternals и listdll, т.е.:

c:\SysInternals>handle
[...]
------------------------------------------------------------------------------
gvim.exe pid: 5380 FOO\alois.mahdal
   10: File  (RW-)   C:\Windows
   1C: File  (RW-)   D:\some\locked\path\OpenFile.txt
[...]

c:\SysInternals>listdlls
[...]
------------------------------------------------------------------------------
Listdlls.exe pid: 6840
Command line: listdlls

  Base        Size      Version         Path
  0x00400000  0x29000   2.25.0000.0000  D:\opt\SysinternalsSuite\Listdlls.exe
  0x76ed0000  0x180000  6.01.7601.17725  C:\Windows\SysWOW64\ntdll.dll
[...]

c:\SysInternals>listdlls

К сожалению, вам нужно "запустить как администратор", чтобы иметь возможность использовать их.

Также listdlls и дескриптор не создают непрерывную табличную форму, поэтому фильтрация имени файла скроет PID. findstr /c:pid: /c:<filename> должно быть очень близко к обеим утилитам, хотя

c:\SysinternalsSuite>handle | findstr /c:pid: /c:Driver.pm
System pid: 4 \<unable to open process>
smss.exe pid: 308 NT AUTHORITY\SYSTEM
avgrsa.exe pid: 384 NT AUTHORITY\SYSTEM
[...]
cmd.exe pid: 7140 FOO\alois.mahdal
conhost.exe pid: 1212 FOO\alois.mahdal
gvim.exe pid: 3408 FOO\alois.mahdal
  188: File  (RW-)   D:\some\locked\path\OpenFile.txt
taskmgr.exe pid: 6016 FOO\alois.mahdal
[...]

Здесь мы видим, что gvim.exe - это открытый файл.

Ответ 7

Если вы щелкните правой кнопкой мыши значок "Компьютер" (или "Мой компьютер" ) и выберите "Управление" во всплывающем меню, которое приведет вас к консоли управления компьютером.

Там, в разделе "Системные инструменты\Общие папки", вы найдете "Открыть файлы". Вероятно, это близко к тому, что вы хотите, но если файл находится в сетевом ресурсе, вам нужно будет сделать то же самое на сервере, на котором находится файл.

Ответ 8

Существует программа "OpenFiles", которая, как представляется, является частью окон 7. Кажется, что она может делать то, что вы хотите. Он может отображать файлы, открытые удаленными пользователями (через общий доступ к файлам), и после вызова "openfiles/Local on" и перезапуск системы, он должен показывать файлы, открытые локально. Говорят, что последнее имеет штрафы за производительность.

Ответ 9

Используйте Process Explorer, чтобы найти идентификатор процесса. Затем используйте Handle, чтобы узнать, какие файлы открыты.

Например, handle -p

Мне нравится этот подход, потому что вы используете утилиты самой Microsoft.

Ответ 10

В OpenedFilesView в меню "Параметры" есть пункт меню "Показать сетевые файлы". Возможно, с включенной поддержкой, вышеупомянутая утилита может быть использована.