Як я можу визначити, чи відкритий певний файл у Windows? [зачинено]


87

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

Сьогодні я здивувався, які програми в системі WinXP мають відкритий конкретний файл. Чи існує якась еквівалентна утиліта lsof? Крім того, файл, про який йде мова, надсилався до мережі, тому я не впевнений, що це ускладнює справи.

Відповіді:


73

Використовуйте Провідник процесів із Sysinternals Suite, функція «Знайти ручку» або функція DLL дозволить вам шукати процес із відкритим файлом.


Це насправді відповідає на питання? Провідник процесів дозволяє побачити, які файли відкриті для певного процесу / дескриптора / dll / чого завгодно, але це зворотне відображення. Дивіться мою відповідь stackoverflow.com/questions/15708/… на це питання.
Грег Маттес

6
Так. Клацніть на Find Handle або Dll (або натисніть Ctrl-F), введіть ім'я файлу, який ви шукаєте, і ви отримаєте список процесів із відкритим цим файлом.
Jay Hofacker,

Провідник процесів тепер перейменовано та об'єднано у "Монітор процесів".
Matthew McCullough

7
@MatthewMcCullough Будь-які посилання? Ви неправильні, Process Explorer і Process Monitor - це дві різні утиліти.
Alois Mahdal

2
Чи має Провідник процесів інтерфейс командного рядка?
Anderson Green

40

Еквівалентом lsof -p pidє комбінований вивід із sysinternals handle і listdll, тобто

handle -p pid
listdlls -p pid

ви можете дізнатися pid з систематичними 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.
Пощастило

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

На жаль, вам потрібно "запустити адміністратора", щоб мати можливість ними користуватися.

Також 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, але не ваші документи.
Тобіас

5

Якщо файл є .dll, ви можете скористатися програмою командного рядка TaskList, щоб побачити, чий він відкритий:

TaskList /M nameof.dll

3

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


1
Я приходжу сюди, шукаючи спосіб дізнатися, хто заважає мені видаляти папку та уникати перезапуску, і я вважаю, що потрібна мені команда вимагає налаштування конфігурації, яка ... як ви здогадалися .... вимагає перезапуску. Як дуже дуже вікна.
Гас,

люди, майте на увазі, що команда openfiles займає тривалий час для запуску (близько 4 хвилин)!
NH.

2

Якщо ви клацніть правою кнопкою миші на піктограмі "Комп'ютер" (або "Мій комп'ютер") і у розкривному меню виберіть "Керувати", це перенесе вас на консоль керування комп'ютером.

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


3
Зверніть увагу, що тут відображаються лише спільні файли, відкриті іншими користувачами мережі. Це не допомагає знаходити файли, відкриті в локальній системі. Виконання цього на сервері, мабуть, скаже вам, у якого користувача був відкритий файл, але не в програмі на машині цього користувача. Провідник процесів (як згадував @JayHofacker) добре працював у мене.
tomlogic

2

Використовуйте Провідник процесів, щоб знайти ідентифікатор процесу. Потім за допомогою Handle з’ясуйте, які файли відкриті.

Наприклад ручка -р

Мені подобається такий підхід, оскільки ви використовуєте утиліти від самої Microsoft.


якби у нас був вихідний код для них
сірий вовк

2

У OpenedFilesView в меню Параметри є пункт меню з назвою "Показати мережеві файли". Можливо, якщо включити цю функцію, згадана вище утиліта буде корисною.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.