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

87

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

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

Дэниел Фоне
источник

Ответы:

74

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

Джей Хофакер
источник
Это действительно ответ на вопрос? Process Explorer позволяет вам видеть, какие файлы открыты для определенного процесса / дескриптора / dll / чего угодно, но это обратное отображение. См. Мой ответ stackoverflow.com/questions/15708/… на этот вопрос.
Грег Мэттес,
6
Да. Нажмите «Найти дескриптор» или «Dll» (или нажмите Ctrl-F), введите имя файла, который вы ищете, и вы получите список процессов с открытым этим файлом.
Джей Хофакер,
Обозреватель процессов теперь переименован и включен в «Монитор процессов».
Мэтью Маккалоу,
7
@MatthewMcCullough Есть ссылки? Вы ошибаетесь, Process Explorer и Process Monitor - две разные утилиты.
Alois Mahdal
2
Есть ли у Process Explorer интерфейс командной строки?
Андерсон Грин
41

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

handle -p pid
listdlls -p pid

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

Питер - Восстановить Монику
источник
Это идет со стандартной установкой Windows, такой как Windows 10?
Мортен
10

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

промах
источник
@slipsec FileMon и Regmon теперь заменены Process Monitor v3.2 в версиях Windows, начиная с Windows 2000 SP4, Windows XP SP2, Windows Server 2003 SP1 и Windows Vista.
Lucky
7

Один эквивалент 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 открыл этот файл.

Алоис Махдаль
источник
5

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

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

Грег Мэттес
источник
4
Unlocker отображает только заблокированные файлы, но не открытые файлы. Большинство программ Windows блокируют используемые DLL, но не ваши документы.
Tobias
5

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

TaskList /M nameof.dll
Шон
источник
3

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

анонимный
источник
1
Я приехал сюда в поисках способа узнать, кто мешает мне удалить папку и избежать перезапуска, и я обнаружил, что нужная мне команда требует настройки конфигурации, которая ... как вы уже догадались ... требует перезапуска. Как очень окна.
Gus
ребята, имейте в виду, что выполнение команды openfiles занимает ДОЛГОЕ время (порядка 4 минут)!
NH.
2

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

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

Мэтт Гамильтон
источник
3
Обратите внимание, что здесь отображаются только общие файлы, открытые другими пользователями сети. Это не помогает найти файлы, открытые в локальной системе. Выполнение этого на сервере, вероятно, скажет вам, какой пользователь открыл файл, но не какая программа на компьютере этого пользователя. Обозреватель процессов (как упоминал @JayHofacker) хорошо работал у меня.
tomlogic
2

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

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

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

pushNpop
источник
если бы у нас был исходный код для них
graywolf 02
2

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

M8R-qpgep8
источник