Как получить путь UNC вместо сопоставленного пути диска из JFileChooser - PullRequest
4 голосов
/ 20 апреля 2011

Просто интересно, есть ли способ вернуть обратно UNC-путь из файла, выбранного с помощью JFileChooser. Файл, который я бы выбрал, будет находиться на подключенном диске с UNC-путем. Прямо сейчас я могу только восстановить букву диска подключенного диска.

Ответы [ 4 ]

2 голосов
/ 05 июля 2014

С https://stackoverflow.com/users/715934/tasoocoo

В итоге я нашел решение, которое выполняет команду NET USE:

 filePath = fc.getSelectedFile().getAbsolutePath();
 Runtime runTime = Runtime.getRuntime();
 Process process = runTime.exec("net use");
 InputStream inStream = process.getInputStream();
 InputStreamReader inputStreamReader = new InputStreamReader(inStream);
 BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
 String line = null;
 String[] components = null;
 while (null != (line = bufferedReader.readLine())) {
   components = line.split("\\s+");
    if ((components.length > 2) && (components[1].equals(filePath.substring(0, 2)))) {
      filePath = filePath.replace(components[1], components[2]);
    }
 }
1 голос
/ 09 августа 2016

Как я прокомментировал ответ Джерри, ShellFolder.getDisplayName ненадежен, поскольку пользователь может изменить отображаемое имя на любое желаемое.

Однако путь UNC, кажется, доступен через sun.awt.shell.ShellFolder.Это, конечно, «внутренний проприетарный API», поэтому нет гарантии, что он продолжит работать в будущих версиях java, но при тестировании на java 1.8.0_31 в Windows 7 я вижу ShellFolderColumnInfo под названием Attributes, который для сетевых дисков выглядит каквключите путь UNC как голый String.Например:

File networkDrive = new File("G:\");
ShellFolder shellFolder = ShellFolder.getShellFolder(networkDrive);
ShellFolderColumnInfo[] cols = shellFolder.getFolderColumns();
for (int i = 0; i < cols.length; i++) {
    if ("Attributes".equals(cols[i].getTitle())) {
        String uncPath = (String) shellFolder.getFolderColumnValue(i);
        System.err.println(uncPath);
        break; // don't need to look at other columns
    }
}

Если вы перейдете в «Мой компьютер» в проводнике, перейдите в представление «Подробности» и включите столбец «Сетевое расположение», он будет соответствовать тому, что мы получаем из «Атрибутов» через ShellFolderAPI.Не уверен, откуда берутся «Атрибуты» или они меняются в неанглийских локалях.

1 голос
/ 20 марта 2014

Если кто-то еще ищет альтернативное (и я думаю, более простое) решение, Вы можете найти информацию, используя ShellFolder.getDisplayName (). Например, вы можете проанализировать сетевое расположение диска из строки здесь:

System.out.println(ShellFolder.getShellFolder(new File(filePath.substring(0,3))).getDisplayName());

Это также может быть полезно:

File.listRoots();
1 голос
/ 28 мая 2012

Метод JFileChooser getSelectedFile() возвращает File, который может содержать полезную информацию.

"Для MicrosoftПлатформы Windows,… префикс UNC-пути "\\\\"; имя хоста и имя общего ресурса - это первые два имени в последовательности имен. "

...