Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Averiguar Cuál Es El Programa Que Abre Un Archivo Por Defecto.
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Averiguar Cuál Es El Programa Que Abre Un Archivo Por Defecto. 
 
Subí este hilo Enlacey se me contestó a lo que preguntaba... pero no era eso lo que quería. Necesito averiguar con qué programa va a abrir el sistema un archivo concreto.
xdg-open lo abre. gnome-open lo abre (si tenemos gnome, claro). Pero yo necesito saber qué programa va a ser.

¿Cómo o dónde se puede averiguar eso? copio y pego lo que puse en el otro hilo, por si es de ayuda.

Citar:
Parece que puedes encontrar el tipo de archivo con el comando:

xdg-mime query filetype <archivo>  (lo que te devuelve el mimetype del archivo)

y luego puedes descubrir qué acceso directo de escritorio usa el sistema para abrirlo con

xdg-mime query default <tipo> (lo que te devuelve el nombre del arhivo .desktop del sistema en /usr/share/applications)

después puedes "destripar" el fichero .desktop para averiguar el programa. Por ejemplo:

cat <fichero.desktop>|grep Exec=|cut -d= -f2

Vale. Pero luego te encuentra con que hay archivos que no tienen ese .desktop, por ejemplo los de libreoffice.
¿Cómo los abrirías entonces?

 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Averiguar Cuál Es El Programa Que Abre Un Archivo Por Defecto. 
 
Escribì esta pagina en el WIKI del foro italiano:

http://www.gambas-it.org/wiki/index...un_tipo_di_file
 



 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Averiguar Cuál Es El Programa Que Abre Un Archivo Por Defecto. 
 
Vuott:
Eso ya lo estuve mirando pero, al menos en mi ordenador, me da resultados raros. Ejecutando el código de tu colega me sale ésto:
Citar:
Il file '/home/jorge/fichero.txt' è associato con il programma: ebook-viewer
Il file '/home/jorge/shordi.txt' è associato con il programma: ebook-viewer
Il file '/home/jorge/0901e6ebb590beac.pdf' è associato con il programma: ebook-viewer
Il file '/home/jorge/Documentos/CONTRATO DE COMPRA.doc' è associato con il programma: libreoffice
Il file '/home/jorge/Documentos/CSS-para-imprimir-paginas-web.pdf' è associato con il programma: ebook-viewer
Il file '/home/jorge/Documentos/ejercicio.odt' è associato con il programma: ebook-viewer


Como ves, salvo el .doc todos los demás los da asociados al visor de ebooks del programa Calibre, cosa que no tengo asociada así.
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Averiguar Cuál Es El Programa Que Abre Un Archivo Por Defecto. 
 
Bueno, creo que lo tengo... más o menos.
Lo he conseguido jugueteando con los scripts de  xdg-utils en la shell. El tema sería más o menos así:

     tmp = Temp()
     s = "cat /usr/share/applications/$(xdg-mime query default `xdg-mime query filetype \"" & docum & "\"`)|grep Exec=|cut -d= -f2|tail -1|sed 's/\\%U//'|sed 's/\\n//' >" & tmp    
     Shell s Wait
 


Es decir: averiguamos el tipo mime del fichero (xdg-mime query filetype); luego averiguamos qué lanzador de escritorio (.desktop) se usa para abrir ese tipo (xdg-mime query default); luego lo abrimos (cat); y buscamos la/s línea/s (hay archivos que tienen varias) donde aparezca Exec=; de estas líneas  cogemos sólo la última (tail -1); esta linea la cortamos (cut) por el =; y cogemos la segunda mitad (f2); a ésta mitad le quitamos el %U (sed) que la mayoría de .desktop tienen; y el retorno de carro final (sed otra vez). El resultado es el nombre del programa lanzador y lo almacenamos en el archivo tmp.
para lanzar el programa usamos otra llamada a shell o exec:

Exec [ file.load(tmp) ,"\"" & docum & "\""] Wait
 


Y, ahora sí, por fín, nuestro programa se detiene en tanto el proceso lanzado esté en marcha.

Hay un par de detalles con los que no estoy contento: No tengo la habilidad suficiente como para eliminar el %U (que puede estar o no) y el retorno de carro (que siempre está) con una sola expresión regular de sed. Por eso uso dos pero sospecho que se puede hacer con una. Si alguien me echa una mano en eso, genial.

La otra cosa es que esto funciona basado en el mimetype pero el algoritmo para averiguar el programa de un archivo es más complejo que el mimetype. A parte de la extensión se puede mirar el contenido del propio fichero, los metadatos si los hay, etc. etc. Por tanto la solución ésta no es perfecta.

Para mejorarla, en los casos que falle, le dejamos el trabajo a xdg-open (que es lo mismo que a gnome-open) que sí suele funcionar y controlamos "a pelo" la ejecución del proceso.
La función de abrir fichero y esperar a que se termine de editar o ver, por tanto, queda así:

Public Function editwait(docum As String) As Boolean

     Dim tmp, s, id As String
     Dim closed As Boolean
     Dim oldModified As Date
    
     If Not docum Then Return
     oldModified = Stat(docum).LastModified
     tmp = Temp()
     s = "cat /usr/share/applications/$(xdg-mime query default `xdg-mime query filetype \"" & docum & "\"`)|grep Exec=|cut -d= -f2|tail -1|sed 's/\\%U//'|sed 's/\\n//' >" & tmp    
     Shell s Wait
     s = File.Load(tmp)
     If s Then                        'si s está vacía es que ha fallado la búsqueda por mimetype
         s = Replace(File.Load(tmp), "\n", " ") & "\"" & docum & "\""
         Shell s Wait
     Else                              'Como ha fallado lanzamos xdg-open ...
        Exec ["xdg-open", docum]
        Wait 5                        'le damos tiempo para que se abra
        tmp = Temp()
        Try Kill tmp 'profilaxis
        'buscamos el proceso basándonos en el nombre del documento (valido para libreoffice, pero puede fallar según qué programa se abra)
        Shell "ps -ef|grep \"" & File.Name(docum) & "\" >" & Tmp Wait  
        id = Mid(File.Load(tmp), 10, 6)     'obtenemos el ID del proceso
        Do
           Try Kill tmp 'profilaxis
           Shell "ps -h " & id & " > " & tmp Wait   ' y hacemos un bucle que mira una y otra vez si el proceso está abierto
           If Stat(tmp).Size = 0 Then closed = True
        Loop Until closed
     Endif
     If Stat(docum).LastModified <> oldModified Then
         Return True
     Else
        Return False
     Endif
    
End


Supongo que también en lugar de hacer el bucle basandonos en llamadas a ps -h ( Shell "ps -h " & id & " > " & tmp Wait  ) Se podría crear un proceso y hacer el bucle basándonos en el estado del proceso (while mi proceso.running), pero me ha parecido más engorroso que hacerlo así y tampoco le veo la ventaja.
 
Aún sigue sin ser perfecta... pero para mis fines (abrir documentos de libreoffice e imágenes y vídeos como mucho), me vale.

Saludos.
 



 
última edición por shordi el Lunes, 27 Abril 2015, 10:10; editado 2 veces 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Averiguar Cuál Es El Programa Que Abre Un Archivo Por Defecto. 
 
Hola!.

¿ Alguien sabe por qué cambia el color en el asunto del mensaje ?. Me parece que lo he visto en más de un mensaje.  

 cambio_de_color

No sabía que existía esto:

http://www.file-extension.org/es

 

Jorge:

Y esta comilla ?
Citar:

xdg-mime query default `


¿ Qué función tiene de esa forma ?. Había probado solo esta linea pero se me queda la consola con >
vamos que le falta algo.

xdg-mime query default `xdg-mime query filetype ResumenDeCuentas.ods
 


Ale, me veo otra vez repasando Shell...

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Lunes, 27 Abril 2015, 12:16; editado 2 veces 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Averiguar Cuál Es El Programa Que Abre Un Archivo Por Defecto. 
 
Una cosita más:

En el código veréis que se busca el .desktop apropiado en /usr/share/applications Ahí están los accesos por defecto del sistema. Si se han modificado o añadido accesos no estarán ahí. En el comando env de la consola encuentro, en mi aparato, esta variable:

Citar:
XDG_DATA_DIRS=/usr/share/default:/usr/share/gnome:/usr/local/share/:/usr/share/:/usr/share/mdm/


No sé muy bien qué hace, pero me imagino que buscará por ese orden una carpeta applications donde buscar el desktop. Me ha dado pereza hacer lo mismo, porque para mis metas con los accesos por defecto me vale, pero lo correcto sería mirar en esas carpetas y abrir aquél que encontrases primero.

Saludos
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Averiguar Cuál Es El Programa Que Abre Un Archivo Por Defecto. 
 
shordi escribió: [Ver mensaje]
Vuott:
en mi ordenador, me da resultados raros.


...y asì ?
For Each df In DesktopFile.FromMime(DesktopMime.FromFile(percorso).Type)
       Print df.ProgramName
Next

 



 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Averiguar Cuál Es El Programa Que Abre Un Archivo Por Defecto. 
 
Vuott:

Así, es excesivo y confuso. Por ejemplo, esto es lo que devuelve para un archivo .txt
Citar:
ebook-viewer
calibre
libreoffice
gedit


Es la lista de todo lo que puede abrir un archivo .txt. ¿Cómo decidir cuál es el por defecto?

Shell:
Citar:
Y esta comilla ?

Las comillas simples se usan en la shell para evaluar lo que tienen dentro antes que lo de fuera. Así puedes usar como parámetro de un comando la salida (evaluación) de otro.
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Programa Que Abre Y Edita Bases De Datos S... shordi Aplicaciones/Fragmentos de Código 0 Sabado, 16 Marzo 2013, 13:13 Ver último mensaje
shordi
No hay nuevos mensajes Cómo Puedo Obtener La Ruta Del Directorio... edivaldo General 2 Viernes, 25 Abril 2014, 02:17 Ver último mensaje
edivaldo
No hay nuevos mensajes Averiguar Espacio Que Ocupa Un Archivo Shell General 4 Domingo, 22 Noviembre 2015, 21:35 Ver último mensaje
Shell
No hay nuevos mensajes Averiguar La Extensión De Un Archivo. Mé... Shell General 3 Lunes, 16 Enero 2017, 00:39 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

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
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron