Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Not possible to launch a file on a network using Java Desktop?

Tags:

java

file-io

(I have a problem that I illustrated in this question but had no correct answers. I refined my problem and tried to edit the initial question to reflect that but I guess because of the way SO displays unanswered questions it lost momentum and there is no way to revive it. So I am posting my correct question again).


I have a file that resides on a shared network location :

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

(The spaces are there intentionally)

The following code :

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 to the console that the file exists (System.out.println(f.exists());) but throws this exception! :

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)

Has anyone any idea why something like this may happen? I have tried everything from creating URIs to decoding them afterwards... Nothing works.

like image 502
Savvas Dalkitsis Avatar asked Sep 01 '09 15:09

Savvas Dalkitsis


4 Answers

With java 7 you can do this

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());
}
like image 75
mikeyreilly Avatar answered Nov 14 '22 05:11

mikeyreilly


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

This answer was on the bug report, but I've edited it to fix when there is a hash.

like image 29
Daniel Ryan Avatar answered Nov 14 '22 05:11

Daniel Ryan


TL;DR of ZAMMBI's answer (+1 BTW). (Using Java 6)

This works, as expected

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

This fails, due to a known Java bug:

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

This work-around works

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

This work-around seems like it should work, but does not:

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

This work-around works, and seems to be the most general 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://")));
like image 7
Pursuit Avatar answered Nov 14 '22 05:11

Pursuit


It seems that there is a bug when you try to access a resource on a network drive with spaces in the path. See this entry in Sun's bug database.

Since the bug is already a year old, I don't think you'll get a fix anytime soon. Try the latest VM. If that doesn't help, try to get the source for WDesktopPeer. Instead of encoding the path, try to keep it as it was (with backslashes and all) and put quotes around it. That might work.

[EDIT] Specifically, don't replace \ with /, do not prepend file:// and leave the spaces as they are (instead of replacing them with %20)

like image 4
Aaron Digulla Avatar answered Nov 14 '22 05:11

Aaron Digulla