¿Cómo puedo determinar si un archivo específico está abierto en Windows?

Una de mis herramientas favoritas para Linux es lsof , ¡una verdadera razor suiza!

Hoy me encontré preguntándome qué progtwigs en un sistema WinXP tenían un archivo específico abierto. ¿Hay alguna utilidad equivalente a lsof? Además, el archivo en cuestión tenía más de un recurso compartido de red, así que no estoy seguro si eso complica las cosas.

Use Process Explorer desde la Suite Sysinternals, la función Find Handle o DLL le permitirá buscar el proceso con ese archivo abierto.

El equivalente de lsof -p pid es la salida combinada de sysinternals handle y listdlls, es decir,

 handle -p pid listdlls -p pid 

puedes encontrar pid con sysinternals pslist .

Prueba Handle . Filemon & Regmon también son geniales para tratar de descubrir qué hace el progtwig duce foo a su sistema.

Prueba Unlocker .

El sitio Unlocker tiene un gráfico ingenioso (desplácese hacia abajo después de seguir el enlace) que muestra una comparación con otras herramientas. Obviamente, tales comparaciones suelen ser parciales, ya que normalmente las escribe el autor de la herramienta, pero la tabla al menos enumera las alternativas para que pueda probarlas usted mismo.

Si el archivo es .dll, entonces puede usar la aplicación de línea de comandos TaskList para ver quién lo abrió.

 TaskList /M nameof.dll 

Un equivalente de lsof podría ser resultado combinado de Sysinternals ‘ handle y listdlls , es decir:

 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 

Lamentablemente, debe “ejecutar como administrador” para poder usarlos.

Además, listdlls y handle no producen una forma continua de tabla, por lo que al filtrar el nombre de archivo se ocultaría el PID. findstr /c:pid: /c: debería findstr /c:pid: /c: mucho con ambas utilidades, aunque

 c:\SysinternalsSuite>handle | findstr /c:pid: /c:Driver.pm System pid: 4 \ 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 [...] 

Aquí podemos ver que gvim.exe es el que tiene este archivo abierto.

Si hace clic con el botón derecho en el ícono “Ordenador” (o “Mi PC”) y selecciona “Administrar” en el menú emergente, eso lo llevará a la consola de Administración de equipos.

Allí, en Herramientas del sistema \ Carpetas compartidas, encontrará “Archivos abiertos”. Probablemente esté cerca de lo que desea, pero si el archivo está en una red compartida, entonces tendría que hacer lo mismo en el servidor en el que vive el archivo.

Hay un progtwig “OpenFiles”, parece ser parte de Windows 7. Parece que puede hacer lo que quieras. Puede enumerar los archivos abiertos por usuarios remotos (mediante el uso compartido de archivos) y, después de llamar a “archivos abiertos / Local activado” y a un reinicio del sistema, debe poder mostrar los archivos abiertos localmente. Se dice que este último tiene sanciones de rendimiento.

Use Process Explorer para encontrar la identificación del proceso. A continuación, use el control para averiguar qué archivos están abiertos.

Por ejemplo, manejar -p

Me gusta este enfoque porque está utilizando utilidades de Microsoft.

En OpennedFilesView , en el menú Opciones, hay un elemento de menú llamado “Mostrar archivos de red”. Tal vez con eso habilitado, la utilidad antes mencionada es de alguna utilidad.