Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [Java] Visualizzare file con chiamata a Windows

    Ciao a tutti, ho un problema (come sempre...)

    Ho realizzato un applicativo desktop che prevede anche l'associazione di file ad oggetti del sistema.

    Ovviamente è una cosa semplice e l'ho già realizzata.
    Adesso però ho la necessità, sempre attraveso il tool di aprire questi file, magari con un click sul nome o su un bottone "visualizza".

    L'idea più semplice, stabilendo per adesso che il sistema sarà utilizzato sotto windows (scusate, scusate....), vorrei realizzare una semplice chiamata ad api win per lanciare il software associato al tipo di file (magari catturare anche l'icona del software stesso)

    In questo modo il visualizzatore è delegato: i file .doc saranno aperti da word o openoffice, ai .pdf ci pensa acrobat ed, in generale, incarico il sistema operativo di preoccuparsi di tutto.

    Un domani la stessa architettura potrà essere estessa anche per Linux (a meno che ciò che sto prevedendo non esisiti già)

    Grazie a tutti

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Se il sistema deve funzionare sotto Windows (per ora) è sufficiente effettuare una chiamata al comado START (che si trova nella directory %SystemRoot%\system32 raggiungibile per default dal PATH).

    Il comando START prende come parametro il file da aprire e si occupa automaticamente di lanciare l'applicazione associata al file.


    Per eseguire il comando START userai, ovviamente, il metodo exec() della classe Runtime.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Ciao.

    Innanzitutto grazie per la pronta risposta

    Purtroppo, però, sto trovando difficoltà a realizzare tale funzione.

    codice:
    import java.io.File;
    import java.util.Map;
    
    /**
     * 
    
    
     * Title: Win32Launcher
     * </p>
     * 
    
    
     * Description: Launcher per sistemi windows
     * 
     * visualizzatore
     * </p>
     * 
    
    
     * Copyright: Copyright (c) 2005
     * </p>
     * 
    
    
     * Company:
     * </p>
     * 
     * @author Eumene
     * @version
     */
    public class Win32Launcher implements Launcher {
    
    	/**
    	 * Nome comando start
    	 */
    	public static final String START_COMMAND = "START.exe";
    
    	/**
    	 * Avvia il software associato al file in input attraverso una chiamata al
    	 * comando "start" presente nella path
    	 */
    	public void launch(File f) throws LaunchException {
    
    		try {
    
    			// Preparo processo
    			ProcessBuilder pb = new ProcessBuilder(START_COMMAND, f.getAbsolutePath().replaceAll("\\\\", "/"));
    			
    			// Trasferimento enviroment a processo
    			pb.environment().clear();
    			Map<String, String> env = System.getenv();
    			for (String envName : env.keySet()) {
    				pb.environment().put(envName, env.get(envName));
    		    }
    
    			System.out.println(pb.environment());
    			
    			// Lancio processo
    			pb.start();
    
    		} catch (Exception e) {
    
    			throw new LaunchException(LaunchException.PROGRAM_LAUNCH_ERROR, e);
    
    		}
    
    	}
    	
    	public static void main(String argv[]) {
    		try {
    			
    			System.out.println(System.getenv());
    			
    			new Win32Launcher().launch(new File("D:/BackupMaster/Messenger LOG/jms2081278746.xml"));
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
    Il codice riportato è quello che sto provando ad utilizzare ma ricevo sempre l'errore

    java.io.IOException: CreateProcess: START.exe "D:/BackupMaster/Messenger LOG/jms2081278746.xml" error=2

    Puoi essermi di aiuto. Il file da aprire esiste, infatti credo che l'errore sta nel fatto che non trovo il comando "start"

    Ho provato "start", "START", "start.exe", "START.exe" ma niente e come puoi vedere ho trasferito l'enviroment al processo in modo che la PATH sia giusta (PATH contiene %SystemRoot%\system32 come dicevi tu)

    Grazie

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    In teoria non serve impostare la PATH, in quanto dovrebbe essere già correttamente impostata da Windows.

    Prova, piuttosto, a modificare il percorso al file, utilizzando il separatore di percoso di Windows: il backslash (che va quotato!!).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Ho risolto!!

    In realtà non devo chiamare il comando start, anche perchè non c'è nella cartella %SystemRoot%\system32 (prova a cercarlo)

    Il comando start è un servizio offerto dal dos, ovvero cmd.exe in sistemi NT e command.exe in sistemi 9x

    Se avvii il cmd.exe e digiti il nome di un file vedrai che apre il sistema associato, quindi basta il seguente codice:

    codice:
    import java.io.File;
    
    /**
     * 
    
    
     * Title: Win32Launcher
     * </p>
     * 
    
    
     * Description: Launcher per sistemi windows
     * </p>
     * 
    
    
     * Copyright: Copyright (c) 2005
     * </p>
     * 
    
    
     * Company:
     * </p>
     * 
     * @author Eumene
     * @version
     */
    public class Win32Launcher implements Launcher {
    
    	/**
    	 * Comando start
    	 */
    	public static final String COMMAND_PROMPT = "cmd.exe";
    
    	/**
    	 * Comando start
    	 */
    	public static final String ARG_COMMAND = "/C";
    
    	/**
    	 * Avvia il software associato al file in input attraverso una chiamata al
    	 * comando "start" presente nella path
    	 */
    	public void launch(File f) throws LaunchException {
    
    		try {
    
    			// Preparo comando
    			String[] command = new String[3];
    			command[0] = COMMAND_PROMPT;
    			command[1] = ARG_COMMAND;
    			command[2] = "\"" + f.getAbsolutePath().replaceAll("\\\\", "/") + "\"";
    
    			// Lancio comando
    			Runtime.getRuntime().exec(command);
    			
    		} catch (Exception e) {
    
    			throw new LaunchException(LaunchException.PROGRAM_LAUNCH_ERROR, e);
    
    		}
    
    	}
    }
    Funziona alla grande!!!!

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Effettivamente è incluso all'interno di CMD.exe.

    Una volta (credo su WinME) era un file a parte...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.