2009-02-08 15 views
12

Ich versuche herauszufinden, wie der System bevorzugte Editor für eine bestimmte Datei geöffnet wird.Wie Benutzer System bevorzugten Editor für bestimmte Datei zu öffnen?

Sagen wir, wir haben einen Dateimanager, in Java geschrieben. Der Benutzer geht zum Ordner und sieht die Liste der Dateien. Und zum Beispiel gibt es eine Datei Icon.jpg. Der Benutzer klickt doppelt auf den Dateinamen und die Datei öffnet sich im bevorzugten Editor des Systems (d. H. Gimp). Das Hauptproblem ist - wie geht das?

Wir können Runtime.getRuntime().exec("something file") tun, aber auf diese Weise sollten Sie wissen, welches Programm in der Benutzerumgebung bevorzugt wird. Aber wie?

Wir sind auch in der Lage zu tun Desktop.getDesktop().edit(File file), aber auf diese Weise können wir nicht verfolgen Prozess und sind nicht in der Lage zu wissen, dann ist dieser untergeordnete Prozess geschlossen. Anderes Problem - Funktion funktioniert nicht unter Linux (zumindest unter Ubuntu 8.10). Es gibt auch Desktop.getDesktop().open(File file), aber es zwingt den Dateibetrachter anstelle des Systemviewers für diesen Dateityp zu öffnen.

Ich suche die ganze Woche eine Lösung, aber habe keine passende und generische Lösung. Kennen Sie die anderen Ansätze zu dieser Frage? Für mein Projekt wäre es ausreichend, wenn es unter Windows + Linux + Mac funktionieren würde.

Vielen Dank für Ihre Antworten und Ratschläge.

Bearbeiten auf 2009-02-08 23:04

Anderen Vorschlag: kann ich "Applikationsauswahl" Fenster in Windows zwingen und in Linux, wie in Mac mit "Datei öffnen"? Wenn Sie beispielsweise versuchen, eine Datei zu öffnen, werden Sie aufgefordert, eine Anwendung aus der Liste der vom System bevorzugten auszuwählen. (so etwas wie "Öffnen mit ..." im Windows Explorer). Wissen Sie?

+0

Anderer Vorschlag in den Fenstern arbeitet Dies wird: kann ich "Applikationsauswahl" Fenster in Windows und in Linux zu erzwingen, wie in Mac? Zum Beispiel, wenn Sie dann versuchen, die Datei zu öffnen, dann werden Sie aufgefordert, die Anwendung aus der Liste der Systemvorgaben auszuwählen. (so etwas wie "Öffnen mit ..." im Windows Explorer). Wissen Sie? –

Antwort

7

Es scheint, dass, wenn Sie nicht verwenden können java.awt.Desktop Sie zwischen den OSes zu unterscheiden: Fenster:

RUNDLL32.EXE SHELL32.DLL,OpenAs_RunDLL <file.ext> 

Linux:

edit <file.ext> 

Mac:

open <file.ext> 

HTH. Offensichtlich ist das nicht sehr tragbar ...

+0

Das sind Konsolenbefehle, die ich in Runtime.getRuntime() schreiben sollte. Exec() - Funktion, richtig? –

+0

@ArturasSmorgun, das ist richtig –

+0

Beachten Sie, dass 'OpenAs_RunDLL' nicht dokumentiert ist und [nicht immer funktioniert.] (Http://stackoverflow.com/questions/23566667/rundll32-shell32-dll) –

2

Dies ist nicht plattformübergreifende, aber auf Mac OS X können Sie

Runtime.getRuntime().exec("open filename"); 

Die open(1) ausführbare verwendet LaunchServices tun das richtige Programm auszuwählen, auszuführen und verwendet dann, dass die Datei filename Namen zu öffnen .

+0

Danke, ich werde das versuchen. Es ist sehr nützlich für mich, weil ich jetzt meinen Code nur auf Ubuntu und Linux testen kann und keine Ahnung habe, wie es auf Mac ist. :) –

7

Überprüfen Sie das Objekt java.awt.Desktop. In Ihrem Fall sollten Sie edit()

aufrufen Wenn Sie, dass eine bestimmte Plattform diesen Aufruf sicherstellen wollen, unterstützt, dann können Sie so etwas wie die folgenden tun (ich habe diesen Code nicht getestet):

public boolean editFile(final File file) { 
    if (!Desktop.isDesktopSupported()) { 
    return false; 
    } 

    Desktop desktop = Desktop.getDesktop(); 
    if (!desktop.isSupported(Desktop.Action.EDIT)) { 
    return false; 
    } 

    try { 
    desktop.edit(file); 
    } catch (IOException e) { 
    // Log an error 
    return false; 
    } 

    return true; 
} 
+0

Ich weiß definitiv, dass edit() auf Ubuntu nicht funktioniert. Aber diese Funktionalität ist für mich erforderlich. Weißt du, was ich tun soll, wenn edit() nicht unterstützt wird? –

-2

Runtime.getRuntime().exec("CMD /C START filename.ext "); 
+0

Nein. Es wird nicht; p – westman379

Verwandte Themen