2009-09-26 8 views
8

Primero, I found a couple de java specific questions y respuestas para esto. Estoy buscando una solución más "nativa", pero multiplataforma, usando C, C++, algún tipo de scripts de shell, o, en mi caso, Qt.¿Existe una forma de plataforma cruzada no java para iniciar la aplicación asociada para un determinado tipo de archivo?

Así que la pregunta es, ¿existen formas estándar, multiplataforma, de abrir programáticamente la aplicación asociada para ciertos tipos de archivos. ¿O al menos para saber si hay aplicaciones asociadas y poder ubicarlas e iniciarlas?

Por plataforma cruzada me refiero a Windows, OSX y Linux (gnome/kde). El caso de uso es tener una base de datos con archivos almacenados como blobs que se leerán en los tres objetivos diferentes.

Respuesta

10

No conozco ninguna forma de plataforma cruzada.

En Windows, existe el comando start, que iniciará la aplicación predeterminada asociada. (Por ejemplo start foo.doc lanzará la Palabra editor de documentos por defecto, start http://StackOverflow.Com/ el navegador web por defecto y start mailto:[email protected] la aplicación de correo predeterminado.)

En OS X no es el comando open, que hace lo mismo.

Linux es solo un kernel del sistema operativo. Los kernels del sistema operativo no saben nada sobre "tipos de archivos" o "tipos MIME" o "aplicaciones asociadas" o algo por el estilo. Por lo tanto, tal cosa simplemente no puede existir para Linux.

El grupo Freedesktop tiene un specification for an xdg-open command, que funciona en todos los escritorios gráficos compatibles con Freedesktop (ya sean Linux, FreeBSD, NetBSD, OpenBSD, DragonflyBSD, OpenSolaris u otros). Sin embargo, obviamente no está garantizado que funcione en sistemas que no sean Freedesktop y es sin duda no garantiza que funcione en sistemas no gráficos.

En los tres casos, esta es una aplicación de línea de comandos, no una API C o C++, pero obviamente puede llamarla a través de system.

+1

Gracias, xdg-open fue la parte que faltaba. Además, perdone mi uso de "linux" como un término general para ese sabor del sistema operativo. Creo que todos aquí saben que es un kernel, pero aún entienden lo que significa. – FeatureCreep

+0

Sé que puedo ser un poco pedante sobre tales cosas, pero en mi opinión, es importante tener razón acerca de estas cosas: la abrumadora mayoría absoluta de las computadoras Linux * no * admite 'xdg-open'! Mi teléfono móvil, reproductor de DVD, decodificador de televisión por cable, grabadora de disco duro, NAS Box y PDA ejecutan Linux, pero ninguno de ellos tiene 'xdg-open'.Además, cada TiVo en el planeta, y casi todos los WiFi o enrutadores de banda ancha, ejecutan Linux, y ninguno de ellos tiene 'xdg-open'. OTOH, una gran cantidad de FreeBSD, NetBSD, ... escritorios, que * no * ejecutan Linux pero son compatibles con XDG * do * tienen 'xdg-open'. –

+1

Por lo tanto, realmente tiene todo que ver con la especificación de Freedesktop y no tiene nada que ver con Linux. –

1

Existe la llamada al sistema en C, por ejemplo:

system("main.cpp"); 

Esto abrirá el archivo con el editor por defecto (Visual Studio en mi caso). No estoy seguro acerca de Linux y Mac, puede que necesite escribir "open main.cpp" allí (que puede ser solucionado por #ifdef constructs).

+1

Ok, esto funciona en Windows (su prueba) y Mac (acabo de probarlo). Si hay una variante de Linux, entonces esta será la respuesta, supongo. Probé el sistema ("bla.txt") en mi osx y mis linux boxes, y no funcionó, pero con "open bla.txt" funcionó en mi mac. – FeatureCreep

4

Como ha notado que está utilizando Qt, vale la pena mencionar la clase QDesktopServices, y especialmente el método openUrl(QUrl). Hace más o menos lo que has descrito en todas las plataformas compatibles con Qt.

+0

Gracias, esta solución realmente se ajusta a mi problema particular mejor que la solución del "sistema (...)", aunque esa es probablemente más general. – FeatureCreep

Cuestiones relacionadas