2009-09-01 16 views
6

(Mam problem, który zilustrowałem w pytaniu this, ale nie miałem poprawnych odpowiedzi.) Poprawiłem swój problem i próbowałem edytować początkowe pytanie, aby to odzwierciedlić, ale domyślam się, że z powodu sposobu, w jaki SO wyświetla pytania bez odpowiedzi, nie ma sposobu na ożywienie, więc ponownie zamieszczam poprawne pytanie).Nie można uruchomić pliku w sieci za pomocą Java Desktop?


Mam plik, który znajduje się na wspólnej lokalizacji sieciowej:

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

(są tam celowo Przestrzenie)

Poniższy kod:

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(); 
     } 
    } 

} 

wydruków konsola, że ​​plik istnieje (System.out.println (f.exists());), ale rzuca ten wyjątek! :

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) 

Czy ktoś ma pojęcie, dlaczego coś takiego może się zdarzyć? Próbowałem wszystkiego, od tworzenia identyfikatorów URI po ich dekodowanie ... Nic nie działa.

+0

I robi ścieżkę tego samego pliku (to znaczy ze spacjami) działa, gdy plik jest lokalny dla twojego komputera (tj. na C :)? Czy problem dotyczy sieciowego systemu plików? –

+0

Jeśli wkleję ten plik "\\\\ KUROSAVVAS-PC \\ Users \\ kuroSAVV \ \ Desktop \ \ Nowy folder \ Warsaw Panorama.jpg" w oknie "Uruchom", plik otworzy się normalnie. W tym przykładzie udział również znajduje się na dysku lokalnym, ale ogólnie powinien działać z dowolną lokalizacją sieciową. –

+0

(spacje zostały automatycznie usunięte z poprzedniego komentarza, są tam ...) Chciałem również powiedzieć, że jestem uwierzytelniony w stosunku do udziału –

Odpowiedz

4

Wygląda na to, że wystąpił błąd podczas próby uzyskania dostępu do zasobu na dysku sieciowym ze spacjami w ścieżce. Zobacz this entry w bazie danych błędów Sun.

Ponieważ błąd ma już ponad rok, nie sądzę, aby w najbliższym czasie udało się go naprawić. Wypróbuj najnowszą maszynę wirtualną. Jeśli to nie pomoże, spróbuj uzyskać źródło dla WDesktopPeer. Zamiast kodować ścieżkę, staraj się zachować ją w niezmienionym stanie (z ukośnikami odwrotnymi i wszystkimi) i umieszczaj wokół niej cytaty. To może zadziałać.

[Edycja] W szczególności, nie zastępuje \ z / nie dołączana file:// i opuszczać przestrzeń, ponieważ są one (a nie do zastąpienia ich %20)

+0

masz na myśli źródło WDesktopPeer? –

+1

Tak. Napraw źródło WDesktopPeer, aby pozostawić ścieżkę w spokoju i przekazać ją bez modyfikacji kodu macierzystego systemu operacyjnego. –

8

Java 6 rozwiązania:

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; 
} 

Ta odpowiedź dotyczyła raportu o błędzie, ale zmieniłem go, aby naprawić, gdy jest hasz.

+1

działa jak urok, dziękuję panu Zammammu. –

8

z Java 7 można to zrobić

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 ZAMMBI's answer (+1 BTW).(Korzystanie z Java 6)

To działa zgodnie z oczekiwaniami

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

nie ten, ze względu na znany błąd Java:

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

To obejście działa

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

To obejście wygląda na to, że powinno działać, ale nie:

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

To obejście działa, i wydaje się być najbardziej powszechną formą:

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://"))); 
Powiązane problemy