Averiguar Cuál Es El Programa Que Abre Un Archivo Por Defecto.


Subject: 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?

Profile PM  
Subject: 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

Profile PM  
Subject: 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í.

Profile PM  
Subject: 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.

Last edited by shordi on Monday, 27 April 2015, 10:10; edited 2 times in total
Profile PM  
Subject: 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

Last edited by Shell on Monday, 27 April 2015, 12:16; edited 2 times in total
Subject: 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

Profile PM  
Subject: 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

Profile PM  
Subject: 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.

Profile PM  

Page 1 of 1


  
You cannot post new topics
You cannot reply to topics
You cannot edit your posts
You cannot delete your posts
You cannot vote in polls
You cannot attach files
You can download files
You cannot post calendar events

   

This is a "Lo-Fi" version of our main content. To view the full version with more information, formatting and images, please click here.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Generation Time: 0.1354s (PHP: -2% SQL: 102%)
SQL queries: 25 - Debug Off - GZIP Enabled