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

<p>одна вещь, которая раздражает меня в windows, это старая ошибка <strong>нарушение обмена</strong>. часто вы не можете определить, что держит его открытым. обычно это просто редактор или проводник, просто указывающий на соответствующий каталог, но иногда мне приходилось прибегать к перезагрузке компьютера.</p><p>любые предложения о том, как найти виновника?</p>

<p>я имел успех с <a href="http://technet.microsoft.com/en-us/sysinternals/default.aspx">sysinternals</a> <a href="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx">process explorer</a> . с помощью этого вы можете искать, чтобы найти, какой процесс (ы) имеют открытый файл, и вы можете использовать его, чтобы закрыть дескриптор (ы), если хотите. конечно, безопаснее закрыть весь процесс. проявляйте осторожность и рассудительность.</p><p>чтобы найти конкретный файл, используйте пункт меню <code>find->find handle or dll...</code> введите часть пути к файлу. список процессов появится ниже.</p><p>если вы предпочитаете командную строку, sysinternals suite включает инструмент командной строки <a href="http://technet.microsoft.com/en-ca/sysinternals/bb896655.aspx">handle</a> , в котором перечислены открытые дескрипторы. несколько примеров о том, как его использовать:</p><ul> <li><code>c:\program files\sysinternalssuite>handle.exe |findstr /i e:\</code> - найти все файлы, открытые с диска e:</li> <li><code>c:\program files\sysinternalssuite>handle.exe |findstr /i file-or-path-in-question</code></li> </ul>

<p>вы можете использовать <strong> resource monitor </strong> для этого, который поставляется <strong> встроенным </strong> с windows 7, 8 и 10.</p><ol> <li>откройте <strong> монитор ресурсов </strong>, который можно найти <ul> <li>выполнив поиск <strong> resource monitor </strong> или <strong> resmon.exe </strong> в меню "пуск", или</li> <li>как кнопка на вкладке <strong> </strong> в вашем <em> диспетчере задач</em></li> </ul> </li> <li>перейдите на вкладку <strong> [~ # ~] [~ # ~] </strong></li> <li>используйте <strong> поле поиска </strong> в <strong> разделе связанных дескрипторов </strong> <ul> <li>смотрите синюю стрелку на снимке экрана ниже</li> </ul> </li> </ol><p>найдя дескриптор, вы можете определить процесс, посмотрев на столбец "изображение" и/или "pid".</p><p>затем вы можете попытаться закрыть приложение, как обычно, или, если это невозможно, просто щелкнуть правой кнопкой мыши по дескриптору и завершить процесс прямо оттуда. очень просто!</p><p><img src="https://i.stack.imgur.com/e2tjv.png" alt="resource monitor screenshot"></p><p><em> скопировано из моего исходного ответа: <a href="https://superuser.com/a/643312/62">https://superuser.com/a/643312/62</a> </em></p>

<p>попробуйте команду <a href="http://technet.microsoft.com/en-us/library/bb490961.aspx">openfiles</a> .</p>

<p>просто будьте очень осторожны с закрывающимися ручками; это даже более опасно, чем вы думаете, из-за повторного использования дескриптора - если вы закроете дескриптор файла, и программа откроет что-то еще, этот оригинальный дескриптор файла, который вы закрыли, может быть повторно использован для этого "чего-то еще". а теперь угадайте, что произойдет, если программа продолжит работу, думая, что она работает с файлом (чей дескриптор вы закрыли), когда фактически этот дескриптор файла теперь указывает на что-то другое.</p><p>смотрите <a href="http://technet.microsoft.com/en-us/magazine/2009.04.windowsconfidential.aspx">сообщение рэймонда чена</a> по этой теме</p><blockquote> <p>предположим, у службы поиска есть файл, открытый для индексации, но он временно застрял, и вы хотите удалить файл, поэтому вы (неразумно) принудительно закрываете дескриптор. служба индекса поиска открывает свой файл журнала, чтобы записать некоторую информацию, и дескриптор удаленного файла повторно используется в качестве дескриптора файла журнала. завершенная операция, наконец, завершается, и служба индекса поиска, наконец, подходит к закрытию того дескриптора, который у нее был открыт, но в конечном итоге невольно закрывает дескриптор файла журнала.</p> <p>служба индекса поиска открывает другой файл, скажем, файл конфигурации для записи, чтобы обновить некоторое постоянное состояние. дескриптор файла журнала перерабатывается как дескриптор файла конфигурации. служба индекса поиска хочет записать некоторую информацию, поэтому она записывает в свой файл журнала. к сожалению, дескриптор файла журнала был закрыт, и этот дескриптор повторно использовался для его файла конфигурации. записанная информация попадает в файл конфигурации, повреждая его.</p> <p>между тем, другой дескриптор, который вы принудительно закрыли, был повторно использован как дескриптор мьютекса, который используется для предотвращения повреждения данных. когда оригинальный дескриптор файла закрыт, дескриптор мьютекса закрывается и защита от повреждения данных теряется. чем дольше служба работает, тем более поврежденными становятся ее индексы. в конце концов, кто-то замечает, что индекс возвращает неверные результаты. и когда вы пытаетесь перезапустить службу, она терпит неудачу, потому что ее файлы конфигурации были повреждены.</p> <p>вы сообщаете о проблеме компании, которая предоставляет службу индекса поиска, и они определяют, что индекс был поврежден, файл журнала загадочным образом прекратил запись, а файл конфигурации был перезаписан мусором. некоторому плохому специалисту поручена безнадежная задача выяснить, почему служба портит свои индексы и файлы конфигурации, не зная, что источником повреждения является то, что вы принудительно закрыли дескриптор.</p> </blockquote>

<p>я успешно использовал <a href="http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx">handle</a> , чтобы найти такие процессы в прошлом.</p>

<p>lockhunter ( <a href="http://lockhunter.com/">http://lockhunter.com/</a> ) работает на 32- и 64-битных системах.</p>

<p>просто для пояснения, это, скорее всего, является результатом неправильного поведения сторонних приложений, которые не используют api-интерфейс <strong>createfile</strong> правильно, чем это должно быть в самой windows. возможно, это является следствием дизайна createfile, но все сделано, и мы не можем вернуться назад.</p><p>в основном при открытии файла в программе windows у вас есть возможность указать флаг, который разрешает общий доступ. если вы не укажете флаг, программа получит монопольный доступ к файлу.</p><p>теперь, если explorer кажется здесь виновником, это может быть тот случай, когда это просто на поверхности, и что настоящий виновник - это то, что устанавливает расширение shell, которое открывает все файлы в папке для своих собственных целей, но это тоже слишком безрассудство при этом, или это не убирает должным образом после себя. symantec av - это то, что я делал раньше, и я не удивлюсь, если виноваты другие av-программы. подключаемые модули управления источником также могут быть неисправны.</p><p>так что на самом деле это не ответ, а всего лишь совет не всегда обвинять windows в том, что может быть плохо написанной сторонней программой (то, что также может произойти в любой другой ос, которая имеет неявную блокировку файлов, но любая ос на основе unix имеет общий доступ с помощью дефолт).</p>

<p> <a href="https://web.archive.org/web/20160102121459/http://www.dr-hoiby.com/wholockme/">кто меня блокирует</a> работает хорошо и развлекает людей этим именем!</p>

<p>по поводу проводника, держащего открытый файл: "когда это происходит с файлом, который нужно удалить, у вас есть выбор принудительного закрытия дескриптора или перезагрузки".</p><p>вы можете просто завершить explorer.</p><p>если это одноразовая вещь (explorer обычно не держит этот файл открытым), то я думаю, что выход из системы и повторный вход помогут.</p><p>в противном случае завершите процесс проводника на рабочем столе и делайте, что хотите, пока он не завершен. сначала запустите копию cmd.exe (вам нужен пользовательский интерфейс, чтобы выполнить запланированную очистку). убедитесь, что не запущены проводники, не относящиеся к рабочему столу. затем убейте последний проводник, например, с помощью диспетчера задач. делайте что хотите в командной строке. наконец, запустите explorer из командной строки, и он станет рабочим столом.</p><p>я предполагаю, что могут быть некоторые остаточные неприятности, если некоторые программы systray не могут справиться с перезапуском shell.</p>

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

<p>файлы могут быть заблокированы локальными процессами ( <a href="http://ccollomb.free.fr/unlocker/">nlocker</a> это инструмент для использования) и доступом к файлам, который приходит через общие ресурсы.</p><p>в windows есть встроенная функция, которая показывает, какие файлы на локальном компьютере открыты/заблокированы удаленным компьютером (у которого файл открыт через общий файловый ресурс):</p><pre><code>* select "manage computer" (open "computer management") * click "shared folders" * choose "open files" </code></pre><p>там вы можете даже принудительно закрыть файл.</p>

<p>с <a href="http://processhacker.sourceforge.net/">process hacker</a> вы можете легко определить, какие процессы хранят ваши файлы:</p><p> <a href="https://i.stack.imgur.com/6khzp.png"><img src="https://i.stack.imgur.com/6khzp.png" alt="find handles or dlls"></a> </p>

<p>также есть nirsoft's <a href="http://nirsoft.net/utils/opened\_files\_view.html">просмотр открытых файлов</a> .</p>

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

<p>есть инструмент filemon и показывает открытые файлы и дескрипторы. трудно не отставать от его дисплея, если вы смотрите его в прямом эфире, он делает это быстро. но вы можете остановить его отображение в реальном времени, и вы можете наблюдать за всеми действиями по открытию/записи файлов. в настоящее время принадлежит microsoft, но первоначально sysinternals</p>

<p>я был включен в <a href="http://www.extensoft.com/?p=free\_task\_manager">расширенный диспетчер задач</a> некоторое время назад в блоге джереми заводни, и он отлично подходит для отслеживания дополнительной информации о процессах. +1 для process explorer, как и выше, особенно для процессов, которые не будут завершены стандартным диспетчером задач.</p>