2009-02-08 18 views
12

Estoy tratando de averiguar cómo abrir el editor preferido del sistema para un archivo determinado.¿Cómo abrir el editor preferido del sistema de usuario para el archivo dado?

Digamos que tenemos un administrador de archivos, escrito en Java. El usuario va a la carpeta y ve la lista de archivos. Y, por ejemplo, hay un archivo Icon.jpg. El usuario hace doble clic en el nombre del archivo y el archivo se abre en el editor preferido del sistema (es decir, Gimp). El problema principal es: ¿cómo hacer eso?

Podemos hacer Runtime.getRuntime().exec("something file"), pero de esta manera usted debe saber qué programa es el preferido en el entorno del usuario. ¿Pero cómo?

También podemos hacer Desktop.getDesktop().edit(File file), pero de esta manera no podemos rastrear el proceso y no podemos saber, entonces este proceso hijo está cerrado. Otro problema: la función no funciona en Linux (al menos en Ubuntu 8.10). También está Desktop.getDesktop().open(File file), pero obliga a abrir el visor de archivos, en lugar de un visor del sistema para ese tipo de archivo.

Estoy buscando una solución toda la semana, pero no tengo ninguna adecuada y genérica. ¿Conoces los otros enfoques a esta pregunta? Para mi proyecto, sería suficiente si funcionara en Windows + Linux + Mac.

Gracias por sus respuestas y consejos.

Editar en 2009-02-08 23:04

Otra sugerencia: puedo forzar la ventana "Selección de aplicaciones" en Windows y en Linux, como en Mac con el "archivo abierto"? Por ejemplo, luego de intentar abrir el archivo, ¿se le pide que elija la aplicación de la lista de sistemas preferidos? (algo así como "Abrir con ..." en el explorador de Windows). ¿Tú sabes?

+0

Otra sugerencia: puedo forzar la ventana "Selección de aplicaciones" en Windows y en Linux, como en Mac? Por ejemplo, cuando intenta abrir un archivo, ¿se le pide que elija la aplicación de la lista de opciones predefinidas por el sistema? (algo así como "Abrir con ..." en Windows Explorer). ¿Sabes? –

Respuesta

7

parece que si no se puede utilizar java.awt.Desktop hay que distinguir entre los sistemas operativos de Windows: :

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

Linux:

edit <file.ext> 

Mac:

open <file.ext> 

HTH. Obviamente, eso no es muy portátil ...

+0

Estos son los comandos de la consola, que se supone que debo escribir en la función Runtime.getRuntime() .exec(), ¿verdad? –

+0

@ArturasSmorgun, es correcto –

+0

Tenga en cuenta que 'OpenAs_RunDLL' no está documentado y [no siempre funciona.] (Http://stackoverflow.com/questions/23566667/rundll32-shell32-dll) –

2

Esto no es multiplataforma, pero en Mac OS X que puede hacer

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

El ejecutable open(1) utiliza LaunchServices para escoger el programa adecuado para ejecutar, y luego lo utiliza para abrir el archivo con el nombre filename .

+0

Gracias, intentaré eso. Es muy útil para mí, porque por ahora puedo probar mi código solo en Ubuntu y Linux y no tengo idea de cómo es en Mac. :) –

7

Echa un vistazo al objeto java.awt.Desktop. En su caso, desea invocar edit()

Si desea asegurarse de que una determinada plataforma es compatible con esta llamada, entonces usted puede hacer algo como lo siguiente (no he probado este código):

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

Definitivamente sé que editar() no funciona en Ubuntu. Pero esta funcionalidad es necesaria para mí. ¿Sabes qué debo hacer si no se admite editar()? –

-2

Esto funcionará en Windows

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

No. No lo hará; p – westman379

Cuestiones relacionadas