Как вы узнаете, какой процесс удерживает файл открытым в Windows?


515

Одна вещь, которая раздражает меня в Windows, это старая ошибка нарушения общего доступа. Часто вы не можете определить, что держит его открытым. Обычно это просто редактор или исследователь, просто указывающий на соответствующий каталог, но иногда мне приходилось прибегать к перезагрузке компьютера.

Любые предложения о том, как найти виновника?


12
Вы могли бы подумать, что после всего этого времени ребята из Windows дадут нам способ сделать это легко из Проводника. Интересно, почему этого не произошло?
Cawflands

6
Я считаю, что Explorer очень часто является проблемным процессом, который удерживает файл без видимой причины.
Эдди

Я знаю, что это вам мало поможет, но я вспомнил, что это была запланированная функция следующего выпуска Windows после Vista и 2008 Server. или, может быть, это вещь WinFS. не уверен, где я это прочитал ...
Кип

см. мой ответ о суперпользователе здесь , в итоге OpenedFilesView все еще работает в 2019 году
Виджай

Ответы:


440

Я имел успех с Sysinternals Process Explorer . С помощью этого вы можете искать, чтобы найти, какой процесс (ы) имеют открытый файл, и вы можете использовать его, чтобы закрыть дескриптор (ы), если хотите. Конечно, безопаснее закрыть весь процесс. Проявляйте осторожность и рассудительность.

Чтобы найти конкретный файл, используйте пункт меню « Find->Find Handle or DLL... Введите» в части пути к файлу. Список процессов появится ниже.

Если вы предпочитаете командную строку, в комплект Sysinternals входит инструмент Handle командной строки , в котором перечислены открытые дескрипторы. Несколько примеров о том, как его использовать:

  • c:\Program Files\SysinternalsSuite>handle.exe |findstr /i e:\ - найти все файлы, открытые с диска E:
  • c:\Program Files\SysinternalsSuite>handle.exe |findstr /i file-or-path-in-question

17
Вы можете закрыть ручку, но имейте в виду, что вы вытаскиваете коврик из-под приложения, результаты будут в лучшем случае непредсказуемыми.
WaldenL

12
@ Уолден: Абсолютно. YMMV. С WinXP у меня много раз было, чтобы Проводник открывал ручку без видимой причины и отказывался закрывать ее. Когда это происходит с файлом, который необходимо удалить, вы можете выбрать принудительное закрытие дескриптора или перезагрузку. До сих пор, проделав это десятки раз, я не пострадал. Как с любым продвинутым инструментом, используйте с осторожностью и суждением.
Эдди

5
Закрытие дескрипторов может привести к тому, что приложение повторно использует дескриптор для другого файла, что приведет к повреждению - см. Ответ Джеффа ниже: serverfault.com/a/15695/79266 ... гораздо безопаснее убить приложение, удерживающее файл открытым, если вы не хочу перезагружаться
RichVel

14
Для исследователя, между прочим, удерживайте Ctrl-Shift и щелкните правой кнопкой мыши пустую область меню «Пуск», и вы получите «Выход из проводника» - ps, не совсем ответ Джеффа.
Марк Соул

2
Это не помогает для не исполнительного файла или текстового файла. Мне нужно знать, кто пишет в файл журнала. Любая идея?
Ксакрон

183

Для этого вы можете использовать Resource Monitor, который встроен в Windows 7, 8 и 10.

  1. Откройте Resource Monitor , который можно найти
    • Выполнив поиск Resource Monitor или resmon.exe в меню «Пуск», или
    • Как кнопка на вкладке « Производительность » в вашем диспетчере задач
  2. Перейти на вкладку CPU
  3. Используйте поле поиска в разделе « Связанные дескрипторы »
    • Смотрите синюю стрелку на снимке экрана ниже

Найдя дескриптор, вы можете определить процесс, посмотрев на столбец «Изображение» и / или «PID».

Затем вы можете попытаться закрыть приложение, как обычно, или, если это невозможно, просто щелкнуть правой кнопкой мыши по дескриптору и завершить процесс прямо оттуда. Очень просто!

Скриншот монитора ресурсов

Скопировано из моего оригинального ответа: https://superuser.com/a/643312/62


2
Стоит отметить, что может быть трудно найти эту программу в Windows 8 - поиск 'resmon.exe' должен найти ее.
Kylotan,

4
@Kylotan, Хватит тратить время на поиски. Просто беги resmon прямо из cmd
Pacerier

1
@Pacerier: Хорошо. Я не привык к вещам, находящимся в пути Windows.
Kylotan

Это подходит мне лучше, чем «Ручка | Альтернативы FindStr 'и' Unlocker ', хотя они также эффективны
Маркус Виниций Помпей

4
Все еще действует в Windows 10 и может быть найден с помощью кнопки «Открыть монитор ресурсов» в диспетчере задач -> вкладка «Производительность».
Норман

92

Попробуйте команду openfiles .


10
+1 для встроенной команды, хотя я лично использую ProcessExplorer для этого большую часть времени.
RBerteig

Действительно полезно.
Марко

7
ОШИБКА: целевая система должна работать под управлением 32-битной ОС.
Bozojoe

4
не работает на 64 ОС!

12
Похоже, что это работает для Windows 2012R2 64bit, но вам нужно включить службу «открыть локальное отслеживание» путем запуска openfiles /local onи перезапуска. Это делает эту функцию не очень полезной.
Гусс

82

Просто будьте очень осторожны с закрывающимися ручками; это даже более опасно, чем вы думаете, из-за повторного использования дескриптора - если вы закроете дескриптор файла, и программа откроет что-то еще, этот оригинальный дескриптор файла, который вы закрыли, может быть повторно использован для этого «чего-то еще». А теперь угадайте, что произойдет, если программа продолжит работу, думая, что она работает с файлом (чей дескриптор вы закрыли), когда фактически этот дескриптор файла теперь указывает на что-то другое.

см. сообщение Раймонда Чена на эту тему

Предположим, у службы поиска есть файл, открытый для индексации, но он временно застрял, и вы хотите удалить файл, поэтому вы (неразумно) принудительно закрываете дескриптор. Служба индекса поиска открывает свой файл журнала, чтобы записать некоторую информацию, и дескриптор удаленного файла повторно используется в качестве дескриптора файла журнала. Завершенная операция, наконец, завершается, и служба индекса поиска, наконец, подходит к закрытию того дескриптора, который у нее был открыт, но в конечном итоге невольно закрывает дескриптор файла журнала.

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

Между тем, другой дескриптор, который вы принудительно закрыли, был повторно использован как дескриптор мьютекса, который используется для предотвращения повреждения данных. Когда оригинальный дескриптор файла закрыт, дескриптор мьютекса закрывается и защита от повреждения данных теряется. Чем дольше служба работает, тем более поврежденными становятся ее индексы. В конце концов, кто-то замечает, что индекс возвращает неверные результаты. И когда вы пытаетесь перезапустить службу, она терпит неудачу, потому что ее файлы конфигурации были повреждены.

Вы сообщаете о проблеме компании, которая предоставляет службу индекса поиска, и они определяют, что индекс был поврежден, файл журнала загадочным образом прекратил запись, а файл конфигурации был перезаписан мусором. Некоторому плохому специалисту поручена безнадежная задача выяснить, почему служба портит свои индексы и файлы конфигурации, не зная, что источником повреждения является то, что вы принудительно закрыли дескриптор.


12
Важное предупреждение, это должно идти ближе к началу - перезагрузка, вероятно, лучше, чем поврежденный файл.
RichVel

6
+1 Это, конечно, заставит меня дважды подумать о принудительном закрытии ручек! Мне кажется странным, что Windows немедленно повторно использовала бы номер закрытого дескриптора, вместо того, чтобы продолжать увеличивать число и только оборачивать его при необходимости. Это, по крайней мере, значительно уменьшит вероятность возникновения этой проблемы.
EM0

1
@RichVel Завершение процесса виновника, вероятно, лучше, чем полная перезагрузка.
Дмитрий Григорьев

@DmitryGrigoryev - хорошая мысль, и я уже упоминал об этом здесь
RichVel

2
Это очень важное предупреждение, но оно не отвечает на вопрос. Как узнать, какой процесс удерживает файл открытым в Windows?
Ploni

29

Я успешно использовал Handle, чтобы найти такие процессы в прошлом.


3
Я использую этот инструмент все время. Если я не могу извлечь USB-диск, я просто набираю «handle H:» (или любую другую букву диска). Лучше всего, вы можете использовать его для принудительного закрытия ручек.
Крис Томпсон



7

Просто чтобы прояснить, это, скорее всего, связано с неправильным поведением сторонних приложений, неправильно использующих вызов API CreateFile, чем с самим Windows. Возможно, это является следствием дизайна CreateFile, но все сделано, и мы не можем вернуться назад.

По сути, при открытии файла в программе Windows у вас есть возможность указать флаг, который разрешает общий доступ. Если вы не укажете флаг, программа получит монопольный доступ к файлу.

Теперь, если Explorer кажется здесь виновником, это может быть тот случай, когда это просто на поверхности, и что истинный виновник - это то, что устанавливает расширение оболочки, которое открывает все файлы в папке для своих собственных целей, но это тоже слишком безрассудство при этом, или это не убирает должным образом после себя. Symantec AV - это то, что я делал раньше, и я не удивлюсь, если виноваты другие AV-программы. Подключаемые модули управления источником также могут быть неисправны.

Так что на самом деле это не ответ, а всего лишь совет не всегда обвинять Windows в том, что может быть плохо написанной сторонней программой (то, что также может произойти в любой другой ОС, которая имеет неявную блокировку файлов, но любая ОС на основе Unix имеет общий доступ с помощью по умолчанию).


1
Я не буду обвинять стороннее приложение в том, что мой проводник Windows всегда блокирует файлы Thumbs.db в своем рабочем каталоге, но не всегда разблокирует его при переключении рабочего каталога. По крайней мере, они открываются, когда я закрываю окно, мне не нужно убивать ВСЕХ исследователей ...
Александр

@ Дарт, Вы маркетолог из Microsoft?
Pacerier

6

На удаленном сервере, когда вы проверяете общий сетевой ресурс, такая простая информация, как консоль управления компьютером, может отображать эту информацию и закрывать файл.


Точно, почему есть такие сложные ответы?
Рохит Гупта

6

По поводу Проводника, держащего открытый файл: «Когда это происходит с файлом, который нужно удалить, у вас есть выбор принудительного закрытия дескриптора или перезагрузки».

Вы можете просто завершить Explorer.

Если это одноразовая вещь (Explorer обычно не держит этот файл открытым), то я думаю, что выход из системы и повторный вход помогут.

В противном случае завершите процесс проводника на рабочем столе и делайте, что хотите, пока он не завершен. Сначала запустите копию cmd.exe (вам необходим пользовательский интерфейс, чтобы выполнить запланированную очистку). Убедитесь, что не запущены проводники без рабочего стола. Затем убейте последний проводник, например, с помощью диспетчера задач. Делайте что хотите в командной строке. Наконец, запустите Explorer из командной строки, и он станет рабочим столом.

Я предполагаю, что могут быть некоторые остаточные неприятности, если некоторые программы systray не могут справиться с перезапуском оболочки.


1
Это гораздо безопаснее, чем закрытие ручки, и менее разрушительно, чем перезагрузка. Относится и к другим программам - я часто обнаруживаю, что программа Microsoft Office блокирует файлы даже после того, как закрыла их.
RichVel

5

Файлы могут быть заблокированы локальными процессами ( разблокировщик - это инструмент для использования) и доступом к файлам, который приходит через общие ресурсы.

В Windows есть встроенная функция, которая показывает, какие файлы на локальном компьютере открыты / заблокированы удаленным компьютером (у которого файл открыт через общий файловый ресурс):

* Select "Manage Computer" (Open "Computer Management")
* click "Shared Folders"
* choose "Open Files"

Там вы можете даже принудительно закрыть файл.




2

Приведенные выше ответы с ответом касаются ситуаций, когда программный процесс удерживает дескриптор файла открытым, что (к счастью) происходит большую часть времени, однако в некоторых случаях (как это происходит в настоящее время в этой системе) сама система содержит дескриптор файла. открытый.

Вы можете идентифицировать эту ситуацию, следуя инструкциям, чтобы найти процесс хранения дескриптора файла с помощью проводника процессов выше, и отметив, что имя процесса указано как «system», или следуя инструкциям, используя монитор ресурсов, и отметив, что изображение не отображается открыть дескриптор файла для вашего интересующего файла (хотя, очевидно, что-то происходит, поскольку вы не можете редактировать / удалять и т. д. файл).

Если это произойдет, ваш вариант (насколько я знаю) - перезапустить - или забыть что-нибудь сделать с этим файлом.


0

Некоторое время назад я был включен в расширенный диспетчер задач в блоге Джереми Заводни, и он отлично подходит для отслеживания дополнительной информации о процессах. +1 для Process Explorer, как и выше, особенно для процессов, которые не будут завершены стандартным диспетчером задач.


0

Есть инструмент FILEMON и показывает открытые файлы и дескрипторы. Трудно не отставать от его дисплея, если вы смотрите его в прямом эфире, он делает это быстро. Но вы можете остановить его отображение в реальном времени, и вы можете наблюдать за всеми действиями по открытию / записи файлов. В настоящее время принадлежит Microsoft, но первоначально Sysinternals


1
Обновленная версия - это монитор процесса. Вы можете получить его здесь: http://technet.microsoft.com/en-us/sysinternals/bb896645
yitwail
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.