Obtener el identificador de bloqueo de archivo.
Me gustaría cerrar los manejadores de todos los procesos que acceden a un cierto archivo. Para recuperar los procesos, utilizo la solución de Eric J. en este hilo. Ahora, desafortunadamente, no funciona cerrar el Process.Handle
con la función Winapi CloseHandle()
. La clase Process
devuelve el PID correcto, pero no el manejador correcto.
Esto también se puede ver al utilizar Handle de Mark Russinovich. Esto devuelve un manejador diferente, que realmente se puede cerrar con la función dada.
Entonces, ¿puedo obtener el manejador de bloqueo de archivo de la clase Process
? Y si no es así ¿qué Winapi debería usar para ello?
Handle por Mark Russinovich (funciona):
C:\dev\Handles\Handle>handle.exe C:\dev\Handles\test.accdb
MSACCESS.EXE pid: 5952 type: File EA4: C:\dev\Handles\test.accdb
Manejador de proceso:
List<process> LockingProcesses = FileUtil.WhoIsLocking(@"C:\dev\Handles\test.accdb");
foreach (Process process in LockingProcesses)
{
CloseHandle(process.Handle);
}
Solución (créditos a Remy Lebeau):
Handle.exe
está informando el manejador de archivo actual dentro del proceso objetivo. Process.Handle
devuelve el manejador de proceso del archivo EXE que creó el proceso que FileUtil.WhoIsLocking()
dice que tiene abierto el archivo objetivo. Son dos cosas completamente diferentes, por eso tienen valores diferentes.
Ver “¿Cómo puedo cerrar un manejador en otro proceso?” para una explicación detallada de cómo encontrar y cerrar manejadores en otros procesos, similar a cómo lo hace Process Explorer de SysInternals.
davy.ai
Para cerrar los identificadores de todos los procesos que acceden a un determinado archivo, no se puede utilizar
Process.Handle
, ya que devuelve el identificador de proceso del archivo EXE que creó el proceso, no el identificador del archivo dentro del proceso. En su lugar, se puede obtener el identificador de bloqueo del archivo mediante una función de Winapi comoNtQuerySystemInformation
yNtQueryObject
.Una explicación detallada de cómo encontrar y cerrar los identificadores en otros procesos, similar a como lo hace SysInternals Process Explorer, se puede encontrar en How can I close a handle in another process.
Alternativamente, se puede utilizar la herramienta Working Handle de Mark Russinovich para identificar el identificador correcto, el cual luego se puede cerrar utilizando la función
CloseHandle()
.