2009-09-26 12 views
8

Po pierwsze, I found a couple z java specific questions i odpowiedzi na to. Szukam bardziej "natywnego", ale wieloplatformowego rozwiązania, używając C, C++, pewnego rodzaju skryptów powłoki lub, w moim przypadku, Qt.Czy istnieje nie-java, międzyplatformowy sposób uruchamiania powiązanej aplikacji dla określonego typu pliku?

Pytanie brzmi, czy istnieje standard, platforma, sposoby programowego otwierania powiązanej aplikacji dla określonych typów plików. Lub przynajmniej dowiedzieć się, czy istnieją powiązane aplikacje i móc je zlokalizować i uruchomić?

Przez platformę krzyżową mam na myśli system Windows, OSX i linux (gnome/kde). Przypadek użycia ma bazę danych z zapisanymi plikami jako obiektami blob, które będą odczytywane na trzech różnych obiektach docelowych.

Odpowiedz

10

Nie znam żadnej platformy między platformami.

W systemie Windows jest polecenie start, które uruchomi powiązaną aplikację domyślną. (Np start foo.doc uruchomi domyślny edytor dokumentów programu Word, start http://StackOverflow.Com/ domyślną przeglądarkę internetową i start mailto:[email protected] domyślnej aplikacji poczty elektronicznej.)

W OS X jest komenda open, który robi to samo.

Linux to tylko jądro systemu operacyjnego. Jądra systemu operacyjnego nie wiedzą nic o "typach plików", "typach MIME" ani "powiązanych aplikacjach" ani tym podobnym. Dlatego coś takiego po prostu nie może istnieć dla systemu Linux.

Grupa Freedesktop ma numer specification for an xdg-open command, który działa na wszystkich komputerach graficznych zgodnych z Freedesktop (zarówno Linux, FreeBSD, NetBSD, OpenBSD, DragonflyBSD, OpenSolaris, jak i innych). Oczywiście nie można zagwarantować, że będzie działać na systemach innych niż Freedesktop i nie jest gwarantowane, aby pracować z nie-graficznymi systemami.

We wszystkich trzech przypadkach jest to aplikacja wiersza poleceń, a nie API C lub C++, ale można oczywiście wywołać ją przez system.

+1

Dzięki, brakowało części xdg-open. Wybacz też, że używam słowa "linux" jako ogólnego określenia dla tego smaku systemu operacyjnego. Myślę, że wszyscy tutaj wiedzą, że to jądro, ale nadal rozumiemy, co to znaczy. – FeatureCreep

+0

Wiem, że mogę być trochę pedantyczny w takich rzeczach, ale moim zdaniem ważne jest, aby mieć rację co do takich rzeczy: absolutna ogromna przeważająca liczba komputerów z systemem Linux * nie obsługuje * xdg-open'! Mój telefon komórkowy, odtwarzacz DVD, dekoder telewizji kablowej, nagrywarka HDD, NAS box i PDA działają pod kontrolą Linuksa, ale żaden z nich nie ma "xdg-open".Co więcej, każdy TiVo na planecie i prawie każdy router WiFi lub szerokopasmowy działa pod Linuksem, a żaden z nich nie ma "xdg-open". OTOH, dużo FreeBSD, NetBSD, ... komputery stacjonarne, które * nie * działają pod Linuksem, ale są zgodne z XDG * do * mają 'xdg-open'. –

+1

Tak naprawdę ma to wszystko ze specyfikacją Freedesktop i nie ma nic wspólnego z Linuksem. –

1

Jest wywołanie systemowe w C, na przykład:

system("main.cpp"); 

To otworzy plik przy użyciu domyślny edytor (Visual Studio w moim przypadku). Nie jestem pewien co do Linuksa i Maca, może być konieczne napisanie "open main.cpp" (które może być obsługiwane przez #ifdef konstrukcje).

+1

Ok, więc to działa w systemie Windows (test) i mac (właśnie go przetestowałem). Jeśli istnieje wariant linuksa, to taka będzie odpowiedź. Próbowałem systemu ("bla.txt") na moim osxie i moich skrzynkach linuxowych, i to nie działało, ale z "open bla.txt" działało na moim macu. – FeatureCreep

4

Odkąd zauważyłeś, że używasz Qt, warto wspomnieć o klasie QDesktopServices, a szczególnie o metodzie openUrl(QUrl). Jest to prawie to, co opisałeś na wszystkich platformach obsługiwanych przez Qt.

+0

Dzięki, to rozwiązanie faktycznie pasuje do mojego konkretnego problemu lepiej niż rozwiązanie "systemowe (...)", choć jest prawdopodobnie bardziej ogólne. – FeatureCreep

Powiązane problemy