Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: zeux_madr en 25 Febrero 2013, 13:42 pm



Título: Averiguar si un fichero esta abierto
Publicado por: zeux_madr en 25 Febrero 2013, 13:42 pm
Buenas, necesitaria saber como puedo averiguar, de un directorio en el cual tengo cientos de ficheros, si alguno de esos ficheros esta abierto por algun proceso del sistema operativo, en este caso windows, para de esa forma poder saber si puedo copiar ese fichero o no a otra carpeta.

Gracias


Título: Re: Averiguar si un fichero esta abierto
Publicado por: Novlucker en 25 Febrero 2013, 13:52 pm
No dices específicamente en que lenguaje necesitas hacerlo, así que supongo que es batch.
En la suite de Sysinternals tienes handle (http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx), con el cual puedes conseguir eso.

Saludos


Título: Re: Averiguar si un fichero esta abierto
Publicado por: zeux_madr en 25 Febrero 2013, 14:05 pm
Buenas, perdon, el lenguaje es batch, he usado handle, pero algo hare mal por que no me sale lo que esta abierto.

Ejemplo: handle "c:\prueba\"

Dentro de prueba tengo varios ficheros, uno se llama correo.txt.
Dicho fichero lo abri con el notepad++ y al ejecutarlo no se entera de que lo tengo abierto.
Lo estoy ejecutando bien?

saludos


Título: Re: Averiguar si un fichero esta abierto
Publicado por: Novlucker en 25 Febrero 2013, 14:13 pm
Acabo de probar de ese modo y funciona bien :-\

Saludos


Título: Re: Averiguar si un fichero esta abierto
Publicado por: zeux_madr en 25 Febrero 2013, 14:16 pm
a mi me dice no matching handles found, y lo tengo abierto, no lo entiendo.


Título: Re: Averiguar si un fichero esta abierto
Publicado por: Novlucker en 25 Febrero 2013, 14:21 pm
Es verdad!

Acabo de probar con un archivo en notepad++ y no lo muestra :huh:


Título: Re: Averiguar si un fichero esta abierto
Publicado por: zeux_madr en 25 Febrero 2013, 14:23 pm
es mas, si ademas lo borro estando abierto el fichero, me deja borrarlo, por lo que pierdo el contenido que en ese momento estuviera grabando en ese fichero, eso es lo que quiero evitar, que si el fichero esta abierto, y estoy escribiendo, evitar que pueda borrar ese fichero estando abierto.


Título: Re: Averiguar si un fichero esta abierto
Publicado por: Eleкtro en 25 Febrero 2013, 16:50 pm
es mas, si ademas lo borro estando abierto el fichero, me deja borrarlo, por lo que pierdo el contenido que en ese momento estuviera grabando en ese fichero, eso es lo que quiero evitar,

Estás equivocado.

No hay que preocuparse por eso en absoluto, el Notepad, Notepad++ y en general los editores de texto no protegen el archivo que has abierto porque no es necesario hacerlo, no es culpa de la aplicación de SysInternals, sinó de que los editores no modifican la protección de esos archivos... se visualiza una cópia OnTheFly del archivo entero, y en caso de guardarlo, si intentas eliminarlo mientras el archivo está siendo guardado, eso ya es muy distinto y ahí si verás como no puedes eliminarlo, y si has eliminado el archivo préviamente e intentas guardarlo, no ocurrirá ninguna catástrofe, el nuevo archivo se generará con el contenido del archivo que borraste y las modificaciones que le hayas hecho, en cualquier editor vaya.

Si quieres hacer mejores pruebas sobre los permisos, usa un archivo de video abierto por un reproductor (Un reproductor que no séa MediaPlayer Classic/MediaPlayer Classic Home Cinema, porque este tampoco protege el archivo que ejecutas y lo puedes eliminar del disco en cualquier momento mientras sigue la visualización...)

Igual que puedes eliminar un script mientras está en ejecución...

En fín todo eso depende del programa y de como hayan querido desarrollar el aspecto de la seguridad de los archivos abiertos.

No creo que puedas detectar con 100% de certeza si un archivo de TXT ha sido abierto,
Podrías usar WMIC para mostrar la línea de comandos con la que se ejecutaron todas las aplicaciones, al abrir un archivo de texto, estaría en esa línea de comandos, pero si abres otro archivo distinto desde el programa la línea de comandos no se actualizara.

Código:
WMIC Process get commandline /format:list

Así que mi consejo para asegurarte lo máximo posible en esas ocasiones como "archivos de texto" es que combines Handles + WMIC + CMDOW

Con CMDOW puedes obtener el título de la ventana de la aplicación, donde debe salir el nombre del archivo que está abierto en ese momento, pero claro, si en el editor de texto tienes multiples pestañas, en el TitleBar sólo mostrara el nombre del archivo de la pestaña que tengas abierto... por eso te aconsejo combinar y te digo que no lo puedes saber 100% con seguridad.
 
Citar
Código:
C:\>cmdow | find /I "test"
0x230440 1 2752 Res Ina Ena Vis sublime_ C:\Users\Administrador\Desktop\test 2.
0x470404 1 2596 Res Ina Ena Vis notepad  test.txt: Bloc de notas

PD: CMDOW y WMIC no serían necesarios si usases WMI, en cualquier otro lenguaje, pero no conseguirías mejores resultados.

EDITO: Quizás alguien más experimentado en procesos y handles encuentra otra solución más efectiva

Saludos.