es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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 como NtQuerySystemInformation y NtQueryObject.

    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().

Comments are closed.