Abierto en tramitación su expediente se encuentra en tramitación

Explorador de procesos de windows

He estado tratando de averiguar cómo identificar programáticamente el proceso que tiene un bloqueo en un archivo en particular. He buscado a través de la API Win32 y WMI, pero hasta ahora no puedo encontrar nada. Sé que es posible – Sysinternals es capaz de listar cada recurso accedido/bloqueado por cada proceso en el sistema.

Debido a la forma en que funciona el Explorador de Procesos, sospecho que lo que tienes que buscar es una forma de encontrar los manejadores de archivos adjuntos a un proceso dado, y que tendrás que sacar esa lista para cada proceso en el sistema y buscar tu archivo dentro de ella.

No lo sé en Windows, pero a alguien le puede resultar útil saber que, en Linux, puedes usar el comando lsof, o simplemente buscar en las carpetas /proc/PROCESS_ID/fd y ver qué proceso ha abierto el archivo.

Powershell desbloquear archivo utilizado por otro proceso

Una cosa que me molesta mucho de Windows es el viejo error de violación de uso compartido. A menudo no puedes identificar qué es lo que lo mantiene abierto. Normalmente es un editor o explorador que apunta a un directorio relevante, pero a veces he tenido que recurrir a reiniciar mi máquina.

He tenido éxito con Sysinternals Process Explorer. Con esto, puedes buscar qué proceso(s) tiene(n) un archivo abierto, y puedes usarlo para cerrar la(s) manija(s) si quieres. Por supuesto, es más seguro cerrar todo el proceso. Tenga precaución y criterio.

Sólo tenga mucho cuidado con el cierre de los manejadores; es aún más peligroso de lo que usted piensa, debido al reciclaje de manejadores – si usted cierra el manejador de archivo, y el programa abre algo más, ese manejador de archivo original que usted cerró puede ser reutilizado para ese “algo más”. Y ahora adivina qué pasa si el programa continúa, pensando que está trabajando en el archivo (cuyo manejador cerraste), cuando en realidad ese manejador de archivo está ahora apuntando a otra cosa.

Supongamos que un servicio de índice de búsqueda tiene un archivo abierto para su indexación, pero se ha atascado temporalmente y usted quiere eliminar el archivo, por lo que (imprudentemente) fuerza el cierre del manejador. El servicio de índice de búsqueda abre su archivo de registro para registrar alguna información, y el manejador del archivo eliminado se recicla como el manejador del archivo de registro. La operación atascada finalmente se completa, y el servicio de índice de búsqueda finalmente llega a cerrar el handle que tenía abierto, pero termina cerrando involuntariamente el handle del archivo de registro.

Archivo sysinternals bloqueado por proceso

Una cosa que me molesta mucho de Windows es el viejo error de violación de compartición. A menudo no puedes identificar qué es lo que lo mantiene abierto. Normalmente se trata de un editor o explorador que apunta a un directorio relevante, pero a veces he tenido que recurrir a reiniciar mi máquina.

He tenido éxito con Sysinternals Process Explorer. Con esto, puedes buscar qué proceso(s) tiene(n) un archivo abierto, y puedes usarlo para cerrar la(s) manija(s) si quieres. Por supuesto, es más seguro cerrar todo el proceso. Tenga precaución y criterio.

Sólo tenga mucho cuidado con el cierre de los manejadores; es aún más peligroso de lo que usted piensa, debido al reciclaje de manejadores – si usted cierra el manejador de archivo, y el programa abre algo más, ese manejador de archivo original que usted cerró puede ser reutilizado para ese “algo más”. Y ahora adivina qué pasa si el programa continúa, pensando que está trabajando en el archivo (cuyo manejador cerraste), cuando en realidad ese manejador de archivo está ahora apuntando a otra cosa.

Sólo para aclarar, es más probable que esto sea el resultado de aplicaciones de terceros que se comportan mal y que no utilizan la llamada a la API CreateFile correctamente, que algo de Windows en sí mismo. Tal vez sea una consecuencia del diseño de CreateFile, pero lo hecho, hecho está y no podemos volver atrás.

El archivo está abierto en otro programa

Un problema al tratar de averiguar si un archivo está siendo utilizado por otro proceso es la posibilidad de una condición de carrera. Podrías comprobar un archivo, decidir que no está en uso, y justo antes de abrirlo otro proceso (o hilo) salta y lo coge (o incluso lo borra).

En Windows no es tan sencillo, las APIs no están publicadas. Hay una herramienta de sysinternals (handle.exe) que se puede utilizar, pero recomiendo el módulo psutil de PyPi, que es portable (es decir, funciona también en Linux, y probablemente en otros SO):

Me gusta la respuesta de Daniel, pero para los usuarios de Windows, me di cuenta de que es más seguro y sencillo renombrar el archivo con el nombre que ya tiene. Eso resuelve los problemas planteados en los comentarios a su respuesta. Aquí está el código:

Sé que llego tarde a la fiesta pero también tuve este problema y utilicé el comando lsof para resolverlo (que creo que es nuevo respecto a los enfoques mencionados anteriormente). Con lsof podemos básicamente comprobar los procesos que están utilizando este archivo en particular.

Puedes usar inotify para vigilar la actividad en el sistema de archivos. Puedes vigilar los eventos de cierre de archivos, indicando que ha ocurrido un roll-over. También deberías añadir una condición adicional sobre el tamaño del archivo. Asegúrese de filtrar los eventos de cierre de archivos del segundo hilo.