Как я могу определить, открыт ли конкретный файл в Windows?

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

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

Ответов (10)

Решение

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

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

Один эквивалент 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

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

Также listdll и дескриптор не создают непрерывную табличную форму, поэтому фильтрация имени файла скроет 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 открыт.

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

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

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

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

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

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

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

handle -p pid
listdlls -p pid

you can find out pid with sysinternals pslist .

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

TaskList /M nameof.dll

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

Например, ручка -p

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