Como posso determinar se um arquivo específico está aberto no Windows?[fechado]
-
08-06-2019 - |
Pergunta
Uma das minhas ferramentas favoritas para Linux é lsof - um verdadeiro canivete suíço!
Hoje me perguntei quais programas em um sistema WinXP tinham um arquivo específico aberto.Existe algum utilitário equivalente ao lsof?Além disso, o arquivo em questão estava em um compartilhamento de rede, então não tenho certeza se isso complica as coisas.
Solução
Usar Explorador de processos do Sysinternals Suite, a função Find Handle ou DLL permitirá que você pesquise o processo com esse arquivo aberto.
Outras dicas
O equivalente de lsof -p pid
é a saída combinada do identificador sysinternals e listdlls, ou seja
handle -p pid
listdlls -p pid
você pode descobrir o pid com sysinternals pslist
.
Tentar Lidar. Arquivomon & Regmon também são ótimos para tentar descobrir o que o programa duce foo está fazendo no seu sistema.
Um equivalente de lsof poderia ser a saída combinada do Sysinternals ' lidar e listdlls, ou seja:
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
Infelizmente, você precisa “executar como administrador” para poder usá-los.
Também listdlls e lidar não produz um formato semelhante a uma tabela contínua, portanto a filtragem do nome do arquivo ocultaria o PID. findstr /c:pid: /c:<filename>
deve deixar você muito próximo de ambos os utilitários, no entanto
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
[...]
Aqui podemos ver que gvim.exe é quem está com este arquivo aberto.
Tentar destravador.
O site do Unlocker tem um gráfico bacana (role para baixo após seguir o link) que mostra uma comparação com outras ferramentas.Obviamente, tais comparações são geralmente tendenciosas, uma vez que são normalmente escritas pelo autor da ferramenta, mas o gráfico pelo menos lista as alternativas para que você possa experimentá-las por si mesmo.
Se o arquivo for um .dll, você poderá usar o Lista de tarefas aplicativo de linha de comando para ver quem o abriu:
TaskList /M nameof.dll
Se você clicar com o botão direito no ícone “Computador” (ou “Meu Computador”) e selecionar “Gerenciar” no menu pop-up, você será direcionado ao console de Gerenciamento do Computador.
Lá, em Ferramentas do Sistema\Pastas Compartilhadas, você encontrará "Arquivos Abertos".Provavelmente isso está próximo do que você deseja, mas se o arquivo estiver em um compartilhamento de rede, você precisará fazer a mesma coisa no servidor em que o arquivo reside.
Existe um programa "OpenFiles", parece fazer parte do windows 7.Parece que pode fazer o que você quiser.Ele pode listar arquivos abertos por usuários remotos (por meio de compartilhamento de arquivos) e, depois de ligar para "OpenFiles /Local On" e um sistema reiniciado, deve ser capaz de mostrar os arquivos abertos localmente.Diz-se que este último tem penalidades de desempenho.
Use o Process Explorer para encontrar o ID do processo.Então use Lidar para descobrir quais arquivos estão abertos.
Por exemplo, manipular -p
Gosto dessa abordagem porque você está usando utilitários da própria Microsoft.
Em OpenFilesView, no menu Opções, há um item de menu chamado "Mostrar arquivos de rede".Talvez com isso habilitado, o utilitário mencionado seja de alguma utilidade.