Autor |
Mensaje |
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Controlando La Ejecución De Programas Externos.
Hoy me he encontrado un problema bastante extraño:
Imaginad que en vuestro programa queréis abrir un archivo externo con el programa predeterminado del sistema y luego controlar si se ha modificado.
Hasta ahora lo hacía así:
Se supone que el parámetro segundo del desktop.open hace que la ejecución de gambas se detenga hasta la finalización del proceso que lanza desktop.open.
En mi casa funciona de maravilla, pero en el curro me he encontrado que gambas se pasa por el arco de triunfo dicho parámetro.
Ni idea de por qué aquí sí y allí no, que los sistemas e instalaciones son iguales.
¿Solución? pasar del segundo parámetro y hacer una función que lo controle a pelo.
Hela aquí:
Me fastidia tener que recurrir a funciones así, porque se basan en la existencia de algún tipo de bug en la clase Desktop y cualquier día queda obsoleta.
Además, no estoy muy seguro de cómo se comportará en máquinas más lentas, etc.
Para más inri, no me gusta mucho. ¿A alguien se le ocurre otra forma de controlar si el archivo abierto se modifica o no?
Saludos.
|
#1 Lunes, 20 Abril 2015, 16:22 |
|
|
jguardon
Administrador
Registrado: Septiembre 2009
Mensajes: 2708
Edad: 57 Ubicación: Granada
|
Re: Controlando La Ejecución De Programas Externos.
File.Stat ? En lugar de comprobar si ha cambiado el tamaño (cosa que no asegura que el fichero no haya sido cambiado), es mejor comprobar la fecha de modificación con la función Stat()
El problema de hacerlo justo después de su posible modificación o antes por un race-condition es más difícil de solucionar a menos que la apertura del fichero sea síncrona.
Saludos
=================== Jesús Guardón
Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".
"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
|
#2 Lunes, 20 Abril 2015, 16:29 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
Re: Controlando La Ejecución De Programas Externos.
Shordi:
Mirate la carpeta de "recientes", hay puedes ver cual se ha usado recientemente:
Ir a tu perfil -> .local -> share
En este directorio esta un archivo de nombre: recently-used.xbel
Recuerdo que también hay un comando, que te dice que archivos estas abriendo/escribiendo/ en el momento que se produce... pero no me acuerdo cual es...
|
#3 Lunes, 20 Abril 2015, 16:41 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Controlando La Ejecución De Programas Externos.
Jesús:
Citar: En lugar de comprobar si ha cambiado el tamaño (cosa que no asegura que el fichero no haya sido cambiado), es mejor comprobar la fecha de modificación con la función Stat()
Totalmente de acuerdo. Para lo que yo lo quiero me vale así, pero tienes razón. Lo cambiaré.
Citar: a menos que la apertura del fichero sea síncrona.
Ese es el problema. Si desktop.open(fichero, true) funcionase siempre todo esto sería innecesario... pero no me puedo fiar.
Tampoco me atrevo a subir el tema a la lista de correo, porque no sé cómo plantearlo...
Julio:
Citar:
Mirate la carpeta de "recientes",
Lo de recientes no me vale porque A) es configurable, el usuario puede anularla y B) no me indica si se ha modificado o no, sólo si se ha abierto.
Citar: Recuerdo que también hay un comando, que te dice que archivos estas abriendo/escribiendo/ en el momento que se produce... pero no me acuerdo cual es...
Sobre eso sólo conozco
ps -ef|grep <nombre del fichero>
Que me dice si está siendo usado... pero eso es lo mismo que el bucle que hago en el ejemplo de arriba con desktop.windows.name
Saludos.
|
#4 Lunes, 20 Abril 2015, 16:50 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Controlando La Ejecución De Programas Externos.
es mejor comprobar la fecha de modificación con la función Stat()
...pero he visto que, si abrimos un fichero y lo guardamos simplemente con el clasico "Save" sin modificar sus datos, la fecha de modificación cambia.
|
#5 Lunes, 20 Abril 2015, 20:14 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Controlando La Ejecución De Programas Externos.
Citar: si abrimos un fichero y lo guardamos simplemente con el clasico "Save" sin modificar sus datos, la fecha de modificación cambia.
Y además eso. Me quedo con el tamaño. Como el algodón, no engaña: Si no es el mismo es que lo han cambiado aunque lo pueden cambiar sin cambiarlo. Tóma lógica difusa.
|
#6 Lunes, 20 Abril 2015, 22:54 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Controlando La Ejecución De Programas Externos.
Probablemente la única modalidad segura es averiguar los byte de los dos archivos:
Este codigo, pero, presupone que sea tenido conservado el archivo original.
...o una otra manera mas compleja:
última edición por vuott el Lunes, 20 Abril 2015, 23:55; editado 2 veces
|
#7 Lunes, 20 Abril 2015, 23:27 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Controlando La Ejecución De Programas Externos.
El problema es que el archivo original no se conserva, en principio, aunque, eso sí, es más exacto lo que propones.
|
#8 Martes, 21 Abril 2015, 09:49 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Controlando La Ejecución De Programas Externos.
¡¡¡NO ENTIENDO NÁ!!!
Ayer subí este post porque Desktop.open(fichero,True) no quedaba a la espera de la finalización del proceso. En casa sí. En el curro no. Vale. Hice el código que subí, para solucionarlo (aunque el hilo derivó en el tema de cómo saber si ha sido modificado). Vale.
Esta mañana en el curro sí respeta el True.
Tanto trabajo pa ná. Esto me va a sacar loco...
|
#9 Martes, 21 Abril 2015, 10:40 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Controlando La Ejecución De Programas Externos.
Tanto trabajo pa ná. Esto me va a sacar loco...
Yo creo que tu ordenador necesita de un exorcista!
Por ahora, pero, tu podrías gritar: " Vade retro, Satan ! Fuera de mi PC ! "
......siempre hay una solución !
|
#10 Martes, 21 Abril 2015, 12:32 |
|
|
|