Не удается запустить файл в сети с помощью Java Desktop? - PullRequest
6 голосов
/ 01 сентября 2009

(У меня есть проблема, которую я проиллюстрировал в этом вопросе, но у меня не было правильных ответов. Я уточнил свою проблему и попытался отредактировать первоначальный вопрос, чтобы отразить это, но я полагаю, из-за того, что SO отображает неотвеченные вопросы потеряли импульс, и нет никакого способа восстановить его. Поэтому я снова публикую свой правильный вопрос).


У меня есть файл, который находится в общей сетевой папке:

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

(пробелы там есть намеренно)

Следующий код:

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

}

Печатает на консоль, что файл существует ( System.out.println (f.exists ()); ), но выдает это исключение! :

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)

Кто-нибудь знает, почему может произойти нечто подобное? Я перепробовал все, от создания URI до их декодирования ... Ничего не работает.

Ответы [ 4 ]

9 голосов
/ 09 октября 2012

С Java 7 вы можете сделать это

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());
}
8 голосов
/ 16 августа 2011

Решение Java 6:

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

Этот ответ был в отчете об ошибке, но я отредактировал его, чтобы исправить, когда есть хеш.

7 голосов
/ 14 ноября 2012

TL; DR ответ ZAMMBI (+1 BTW). (С использованием Java 6)

Это работает, как и ожидалось

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

Сбой из-за известной ошибки Java:

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

Этот обходной путь работает

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

Похоже, что этот обходной путь должен работать, но не работает:

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

Этот обходной путь работает и представляется наиболее общей формой:

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://")));
4 голосов
/ 01 сентября 2009

Кажется, что есть ошибка при попытке доступа к ресурсу на сетевом диске с пробелами в пути. См. эту запись в базе данных ошибок Sun.

Поскольку этой ошибке уже год, я не думаю, что вы исправите ее в ближайшее время. Попробуйте последнюю ВМ. Если это не поможет, попробуйте получить источник для WDesktopPeer. Вместо того, чтобы кодировать путь, постарайтесь сохранить его как есть (с обратной косой чертой и всем) и заключите его в кавычки. Это может сработать.

[EDIT] В частности, не заменяйте \ на /, не добавляйте file:// и оставляйте пробелы такими, как есть (вместо замены на %20)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...