4

只是想知道是否有办法从使用 JFileChooser 选择的文件中返回 UNC 路径。我将选择的文件将驻留在具有 UNC 路径的映射驱动器上。现在,我似乎只能拉回映射驱动器的驱动器号。

4

4 回答 4

2

来自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]);
    }
 }
于 2014-07-05T06:27:17.330 回答
1

JFileChooser方法getSelectedFile()返回 a File,它可能包含有用的信息。

“对于 Microsoft Windows 平台,……UNC 路径名的前缀是"\\\\";主机名和共享名是名称序列中的前两个名称。”

于 2012-05-28T12:31:38.540 回答
1

正如我对 Gerry 的回答所评论的那样,ShellFolder.getDisplayName这是不可靠的,因为用户可以将显示名称更改为他们想要的任何名称。

但是 UNC 路径似乎可以通过sun.awt.shell.ShellFolder. 这当然是一个“内部专有 API”,因此不能保证这将在未来的 java 版本中继续工作,但在 Windows 7 中针对 java 1.8.0_31 进行测试我看到一个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 从“属性”中获得的内容相匹配。不确定“属性”来自哪里,或者它是否在非英语语言环境中发生变化。

于 2016-08-09T05:01:10.287 回答
0

如果其他人正在寻找替代(我认为更简单)的解决方案,您可以使用 ShellFolder.getDisplayName() 找到信息。例如,您可以从此处的字符串中解析驱动器的网络位置:

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

这也可能有用:

File.listRoots();
于 2014-03-19T21:00:36.503 回答