2009-09-26 8 views
8

Primo, I found a couple di java specific questions e le risposte per questo. Sto cercando più soluzioni "native", ma cross-platform, usando C, C++, qualche tipo di script di shell, o, nel mio caso, Qt.Esiste un modo non java e multipiattaforma per avviare l'applicazione associata per un determinato tipo di file?

Quindi la domanda è, ci sono standard, multipiattaforma, modi per aprire a livello di programmazione l'applicazione associata per determinati tipi di file. O almeno per scoprire se ci sono applicazioni associate ed essere in grado di localizzarle e lanciarle?

Da piattaforma multiplo intendo Windows, OSX e linux (gnome/kde). Il caso d'uso sta avendo un database con i file memorizzati come BLOB che saranno letti sui tre diversi target.

risposta

10

Non conosco alcun modo cross-platform.

In Windows, è disponibile il comando start, che avvierà l'applicazione predefinita associata. (Ad esempio start foo.doc lancerà l'editor di documenti di Word predefinito, start http://StackOverflow.Com/ il browser web predefinito e start mailto:[email protected] la posta app di default.)

In OS X c'è il comando open, che fa la stessa cosa.

Linux è solo un kernel del sistema operativo. I kernel OS non sanno nulla di "tipi di file" o "tipi MIME" o "applicazioni associate" o qualcosa del genere. Pertanto, una cosa del genere semplicemente non può esistere per Linux.

Il gruppo Freedesktop ha uno specification for an xdg-open command, che funziona su tutti i desktop grafici compatibili con Freedesktop (siano essi Linux, FreeBSD, NetBSD, OpenBSD, DragonflyBSD, OpenSolaris o altro). Tuttavia, non è ovviamente garantito il funzionamento su sistemi non-Freedesktop ed è certamente non garantito per funzionare su sistemi non grafici.

In tutti e tre i casi, questa è un'applicazione a riga di comando, non un'API C o C++, ma è ovviamente possibile chiamarla tramite system.

+1

Grazie, xdg-open era la parte mancante. Inoltre, perdona il mio uso di "linux" come termine generale per quel sapore del sistema operativo. Penso che tutti qui sappiano che è un kernel, ma capisco ancora cosa si intende. – FeatureCreep

+0

So che posso essere un po 'pedante su queste cose, ma secondo me è importante essere corretti su queste cose: la stragrande maggioranza assoluta dei computer Linux * non supporta * xdg-open'! Il mio telefono cellulare, lettore DVD, decodificatore TV via cavo, registratore HDD, scatola NAS e PDA eseguono tutti Linux, ma nessuno di questi ha 'xdg-open'.Inoltre, ogni singolo TiVo sul pianeta e quasi tutti i router WiFi o a banda larga eseguono Linux e nessuno di questi ha 'xdg-open'. OTOH, molti desktop FreeBSD, NetBSD, ... che * non * eseguono Linux ma sono compatibili con XDG * do * hanno 'xdg-open'. –

+1

Quindi, ha davvero tutto a che fare con le specifiche Freedesktop e nulla a che fare con Linux. –

1

C'è la chiamata di sistema in C, per esempio:

system("main.cpp"); 

Ciò aprirà il file usando l'editor di default (Visual Studio nel mio caso). Non sono sicuro di Linux e Mac, potresti dover scrivere "open main.cpp" (che può essere preso in considerazione dai costrutti di #ifdef).

+1

Ok, quindi funziona su Windows (il test) e Mac (l'ho appena testato). Se c'è una variante di Linux, allora questa sarà la risposta credo. Ho provato il sistema ("bla.txt") sul mio osx e le mie finestre linux, e non ha funzionato, ma con "open bla.txt" ha funzionato sul mio mac. – FeatureCreep

4

Poiché si è notato che si sta utilizzando Qt, vale la pena menzionare la classe QDesktopServices e in particolare il metodo openUrl(QUrl). Fa più o meno quello che hai descritto su tutte le piattaforme supportate da Qt.

+0

Grazie, questa soluzione si adatta in realtà al mio particolare problema meglio della soluzione "sistema (...)", anche se quella è probabilmente più generale. – FeatureCreep

Problemi correlati