如何从JFileChooser检索UNC路径而不是映射的驱动器路径

|| 只是想知道是否有一种方法可以从使用JFileChooser选择的文件中返回UNC路径。我要选择的文件将驻留在具有UNC路径的映射驱动器上。现在,我似乎只能拉回映射驱动器的驱动器号。     
已邀请:
来自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]);
    }
 }
    
如果其他人正在寻找替代(我认为更简单)的解决方案, 您可以使用ShellFolder.getDisplayName()查找信息。例如,您可以从以下字符串中解析驱动器的网络位置:
System.out.println(ShellFolder.getShellFolder(new File(filePath.substring(0,3))).getDisplayName());
这可能也很有用:
File.listRoots();
    
当我评论格里的答案时,comment3ѭ是不可靠的,因为用户可以将显示名称更改为所需的任何名称。 但是,UNC路径似乎可以通过
sun.awt.shell.ShellFolder
使用。当然,这是一个“内部专有API”,因此不能保证它将在将来的Java版本中继续使用,但是在Windows 7中针对Java 1.8.0_31进行测试时,我看到一个名为“ 6”的“ 5”,用于网络驱动器似乎包含UNC路径为裸ѭ7。例如:
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
    }
}
如果您在资源管理器中转到“我的电脑”,请转到“详细信息”视图并打开“网络位置”列,它似乎与我们通过
ShellFolder
API从“属性”中获得的内容匹配。不知道\“ Attributes \”的来源或在非英语语言环境中是否更改。     
JFileChooser
方法
getSelectedFile()
返回a12ѭ,其中可能有帮助信息。 \“对于Microsoft Windows平台,…UNC路径名的前缀是
\"\\\\\\\\\"
;主机名和共享名是名称序列中的前两个名称。\”     

要回复问题请先登录注册