2009-09-01 6 views
6

(Ho un problema che ho illustrato nella domanda this ma non ho avuto risposte corrette. Ho perfezionato il mio problema e ho provato a modificare la domanda iniziale per riflettere, ma suppongo per il modo in cui SO visualizza domande senza risposta ha perso slancio e c'è non c'è modo di farla rivivere. Quindi sto postando di nuovo la mia domanda corretta).Non è possibile avviare un file su una rete utilizzando Java Desktop?


Ho un file che risiede su un percorso di rete condivisa:

"\\KUROSAVVAS-PC\Users\kuroSAVVAS\Desktop\New  Folder\Warsaw Panorama.JPG" 

(Gli spazi ci sono volutamente)

Il seguente codice:

import java.awt.Desktop; 
import java.io.File; 
import java.io.IOException; 

public class Test { 

    public static void main(String[] args) { 
     try { 
      String s = "\\\\KUROSAVVAS-PC\\Users\\kuroSAVVAS\\Desktop\\New  Folder\\Warsaw Panorama.jpg"; 
      File f = new File(s); 
      System.out.println(f.exists()); 
      Desktop.getDesktop().open(f); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

Stampe a la console che il file esiste (System.out.println (f.exists());) ma lancia questa eccezione! :

java.io.IOException: Failed to open file:////KUROSAVVAS-PC/Users/kuroSAVVAS/Desktop/New%20%20%20%20%20Folder/Warsaw%20%20%20%20Panorama.jpg. Error message: The system cannot find the file specified. 

    at sun.awt.windows.WDesktopPeer.ShellExecute(WDesktopPeer.java:59) 
    at sun.awt.windows.WDesktopPeer.open(WDesktopPeer.java:36) 
    at java.awt.Desktop.open(Desktop.java:254) 
    at Test.main(Test.java:13) 

Qualcuno ha qualche idea del perché una cosa del genere può accadere? Ho provato di tutto, dalla creazione di URI alla decodifica in seguito ... Niente funziona.

+0

e fa il percorso stesso file (vale a dire con spazi) funziona quando il file è locale sul tuo computer (ad esempio su C :)? Il problema è correlato al file system di rete? –

+0

Se si incolla "\\\\ KUROSAVVAS-PC \\ Users \\ kuroSAVVAS \\ Desktop \\ Nuova cartella \ Warsaw Panorama.jpg" nella finestra di dialogo "Esegui" il file si apre normalmente. In questo esempio la condivisione risiede anche sul mio disco locale, ma in generale dovrebbe funzionare con qualsiasi percorso di rete. –

+0

(gli spazi sono stati automaticamente rimossi sul mio commento precedente, sono lì ...) Volevo anche dire che sono autenticato contro la condivisione –

risposta

4

Sembra che ci sia un errore quando si tenta di accedere a una risorsa su un'unità di rete con spazi nel percorso. Vedi this entry nel database dei bug di Sun.

Dal momento che il bug ha già un anno, non penso che avrai una soluzione in qualsiasi momento presto. Prova l'ultima VM. Se ciò non aiuta, prova a ottenere il codice sorgente per WDesktopPeer. Invece di codificare il percorso, prova a mantenerlo com'era (con barre retroverse e tutto) e inseriscici le virgolette. Potrebbe funzionare.

[EDIT] Specificamente, non sostituire \ con /, non anteporre file:// e lasciare gli spazi come sono (invece di sostituirli con %20)

+0

vuoi dire nel sorgente WDesktopPeer? –

+1

Sì. Risolvere il problema con l'origine di WDesktopPeer per lasciare il percorso da solo e passarlo senza alcuna modifica al codice nativo del sistema operativo. –

8

Java 6 solution:

public static void launchFile(File file) { 
    if (!Desktop.isDesktopSupported()) 
     return; 
    Desktop dt = Desktop.getDesktop(); 
    try { 
     dt.open(file); 
    } catch (IOException ex) { 
     // this is sometimes necessary with files on other servers ie 
     // \\xxx\xxx.xls 
     launchFile(file.getPath()); 
    } 
} 

// this can launch both local and remote files 
public static void launchFile(String filePath) { 
    if (filePath == null || filePath.trim().length() == 0) 
     return; 
    if (!Desktop.isDesktopSupported()) 
     return; 
    Desktop dt = Desktop.getDesktop(); 
    try { 
     dt.browse(getFileURI(filePath)); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

// generate uri according to the filePath 
private static URI getFileURI(String filePath) { 
    URI uri = null; 
    filePath = filePath.trim(); 
    if (filePath.indexOf("http") == 0 || filePath.indexOf("\\") == 0) { 
     if (filePath.indexOf("\\") == 0){ 
      filePath = "file:" + filePath; 
      filePath = filePath.replaceAll("#", "%23"); 
     } 
     try { 
      filePath = filePath.replaceAll(" ", "%20"); 
      URL url = new URL(filePath); 
      uri = url.toURI(); 
     } catch (MalformedURLException ex) { 
      ex.printStackTrace(); 
     } catch (URISyntaxException ex) { 
      ex.printStackTrace(); 
     } 
    } else { 
     File file = new File(filePath); 
     uri = file.toURI(); 
    } 
    return uri; 
} 

Questa risposta era nella segnalazione del bug, ma l'ho modificata per correggere quando c'è un hash.

+1

funziona come un incantesimo, grazie Mr.Zammbi. –

8

con Java 7 si può fare questo

public static void main(String[] args) throws IOException { 
    String s = "\\\\KUROSAVVAS-PC\\Users\\kuroSAVVAS\\Desktop\\New  Folder\\Warsaw Panorama.jpg"; 
    Path p = Paths.get(s); 
    Desktop.getDesktop().browse(p.toUri()); 
} 
6

TL; DR di ZAMMBI's answer (+1 BTW).(Utilizzo di Java 6)

Questo funziona, come previsto

Desktop.getDesktop().open(new File("\\\\host\\path_without\\spaces.txt")); //works 

Questo non riesce, a causa di un bug noto Java:

Desktop.getDesktop().open(new File("\\\\host\\path with\\spaces.txt")); //fails <shakes fist> 

Questo work-around funziona

Desktop.getDesktop().browse(new URI("file://host/path%20with/spaces.txt")) //works (note slash direction and escape sequences) 

Questo lavoro sembra funzionare come dovrebbe, ma non lo fa:

Desktop.getDesktop().browse((new File("\\\\host\\path with\\spaces.txt")).toURI()); 

Questo work-around funziona, e sembra essere la forma più generale:

File curFile = new File("\\\\host\\path with\\or_without\\spaces\\local or network.txt"); 
Desktop.getDesktop().browse(new URI(curFile .toURI().toString().replace("file:////","file://"))); 
Problemi correlati