2009-09-01 32 views
6

(Tôi có một vấn đề mà tôi minh họa trong câu hỏi this nhưng không có câu trả lời chính xác. Tôi đã giải quyết vấn đề của mình và cố gắng chỉnh sửa câu hỏi ban đầu để phản ánh điều đó nhưng tôi đoán vì cách SO hiển thị câu hỏi chưa được trả lời mất đà và có không có cách nào để hồi sinh nó. Vì vậy, tôi đăng câu hỏi đúng của mình một lần nữa).Không thể khởi chạy tệp trên mạng bằng Java Desktop?


Tôi có một tập tin đó nằm trong mạng lưới vị trí chia sẻ:

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

(Các không gian là có chủ đích)

Các mã sau đây:

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

} 

Prints để bảng điều khiển tồn tại tệp (System.out.println (f.exists());) nhưng ném ngoại lệ này! :

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) 

Có ai biết tại sao điều gì đó như thế này có thể xảy ra không? Tôi đã thử mọi thứ từ việc tạo các URI để giải mã chúng sau này ... Không có gì hiệu quả.

+0

Và không cùng một con đường tập tin (ví dụ: có khoảng trống) hoạt động khi tệp cục bộ với máy tính của bạn (tức là trên C :)? Sự cố có liên quan đến hệ thống tệp mạng không? –

+0

Nếu tôi dán "\\\ KUROSAVVAS-PC \\ Users \\ kuroSAVVAS \\ Máy tính để bàn \\ Thư mục mới \ Warsaw Panorama.jpg" vào hộp thoại "chạy" tệp mở ra bình thường. Trong ví dụ này, phần chia sẻ cũng nằm trên đĩa cục bộ của tôi nhưng nói chung nó sẽ hoạt động với bất kỳ vị trí mạng nào. –

+0

(các không gian đã được tự động xóa bỏ trong bình luận trước đó của tôi. Họ đang ở đó ...) Tôi cũng muốn nói rằng tôi đã được xác thực đối với phần chia sẻ –

Trả lời

4

Dường như có lỗi khi bạn cố truy cập tài nguyên trên ổ đĩa mạng có dấu cách trong đường dẫn. Xem this entry trong cơ sở dữ liệu lỗi của Sun.

Vì lỗi này đã cũ một năm nên tôi không nghĩ rằng bạn sẽ sớm được khắc phục. Hãy thử VM mới nhất. Nếu điều đó không có tác dụng, hãy thử lấy nguồn cho WDesktopPeer. Thay vì mã hóa đường dẫn, hãy cố gắng giữ nó như cũ (với dấu gạch chéo ngược và tất cả) và đặt dấu ngoặc kép quanh nó. Điều đó có thể hiệu quả.

[EDIT] Cụ thể, đừng thay thế \ với /, đừng thêm vào trước file:// và rời khỏi không gian như họ (thay vì thay thế chúng bằng %20)

+0

bạn có nghĩa là trong nguồn WDesktopPeer? –

+1

Có. Sửa chữa nguồn của WDesktopPeer để rời khỏi đường dẫn một mình và truyền nó mà không cần sửa đổi mã nguồn gốc của hệ điều hành. –

8

Java 6 giải pháp:

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

Câu trả lời này là trên báo cáo lỗi, nhưng tôi đã chỉnh sửa nó để sửa khi có băm.

+1

hoạt động như một sự quyến rũ, cảm ơn Mr.Zammbi. –

8

Với java 7 bạn có thể làm điều này

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 của ZAMMBI's answer (+1 BTW).(Sử dụng Java 6)

này hoạt động, như mong đợi

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

này thất bại, do một lỗi Java được biết đến:

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

công việc xung quanh này hoạt động

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

Công việc này có vẻ như hoạt động, nhưng không:

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

công việc xung quanh này hoạt động, và dường như là hình thức chung nhất:

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://"))); 
Các vấn đề liên quan