Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Controlando La Ejecución De Programas Externos.
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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í:

sizeoriginal=file(miarchivo).Size
desktop.open(miarchivo,true)
if sizeoriginal<>file(miarchivo).size then
   print "se ha modificado"
else
   print "no se ha modificado"
endif
 

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í:

...
...
sizeoriginal=file(miarchivo).Size
desktop.open(miarchivo) 'sin el true de marras
wait 3 'le doy tres segundos al sistema para que abra el programa por defecto (en la versión real no es un número fijo, es un parámetro configurable por el usuario)
docabierto()
if sizeoriginal<>file(miarchivo).size then
   print "se ha modificado"
else
   print "no se ha modificado"
endif
.... etc, etc.


Public Sub docabierto(archivo As String)
    
    Dim f As String
    Dim w As DesktopWindow
    Dim lup As Boolean
    
    f = File.Name(archivo)
    lup = True
    While lup
        lup = False
        For Each w In Desktop.Windows
           If InStr(w.Name, f) > 0 Then
               lup = True
           Endif
        Next
    Wend

End
 


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.
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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...
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Controlando La Ejecución De Programas Externos. 
 
jguardon escribió: [Ver mensaje]
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.
 



 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
     
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Controlando La Ejecución De Programas Externos. 
 
Probablemente la única modalidad segura es averiguar los byte de los dos archivos:

Public Sub Main()

  Dim i As Integer

   i = Comp(File.Load("/ruta/del/archivo/original"), File.Load("/ruta/del/archivo/de/averiguar"))
   If i <> 0 then Print "El archivo fue modificado !"
 
End
    

Este codigo, pero, presupone que sea tenido conservado el archivo original.


...o una otra manera mas compleja:
Public Sub Main()

  Dim i As Integer
  Dim fl1, fl2 As File
  Dim bb1, bb2 As Byte[]
    
    fl1 = Open "/ruta/del/archivo/original" For Read
    fl2 = Open "/ruta/del/archivo/de/averiguar" For Read
    
    If Lof(fl1) = Lof(fl2) Then             ' Si el tamaño es idéntico...
      With bb1 = New Byte[Lof(fl1)]
        .Read(fl1)
      End With
      With bb2 = New Byte[Lof(fl2)]
        .Read(fl2)
      End With
      For i = 0 To bb1.Max
        If bb1[i] <> bb2[i] Then
          Print "Los archivos son diferentes."
          Quit
        Endif
      Next
    Endif

    Print "Los archivos son idénticos."

End

 



 
última edición por vuott el Martes, 21 Abril 2015, 00:55; editado 2 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.

 
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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...

imagen-animada-loco-05
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Controlando La Ejecución De Programas Externos. 
 
shordi escribió: [Ver mensaje]

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 !  
 



 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
0.00 0 0 0
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No puede descargar archivos
No puede publicar eventos en el calendario