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

Java 如何从JFileChooser检索UNC路径而不是映射的驱动器路径,java,jfilechooser,unc,Java,Jfilechooser,Unc,只是想知道是否有办法从使用JFileChooser选择的文件返回UNC路径。我要选择的文件将驻留在具有UNC路径的映射驱动器上。现在,我似乎只能收回映射驱动器的驱动器号。该方法返回a,这可能有有用的信息 “对于Microsoft Windows平台,…UNC路径名的前缀是“\\\\”;主机名和共享名是名称序列中的前两个名称。”如果其他人正在寻找替代(我认为更简单)解决方案, 您可以使用ShellFolder.getDisplayName()查找信息。例如,您可以从以下字符串解析驱动器的网络位置:

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

该方法返回a,这可能有有用的信息


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

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

System.out.println(ShellFolder.getShellFolder(new File(filePath.substring(0,3))).getDisplayName());
这也可能有用:

File.listRoots();

我最终找到了一个执行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]);
    }
 }

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

但是,UNC路径似乎可以通过
sun.awt.shell.ShellFolder
获得。这当然是一个“内部专有API”,因此不能保证它在java的未来版本中继续工作,但在Windows 7中针对java 1.8.031进行测试时,我看到一个名为
ShellFolderColumnInfo
Attributes
,对于网络驱动器,它似乎将UNC路径作为裸
字符串包含在内。例如:

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
    }
}
File networkDrive=新文件(“G:\”;
ShellFolder ShellFolder=ShellFolder.getShellFolder(networkDrive);
ShellFolderColumnInfo[]cols=shellFolder.getFolderColumns();
for(int i=0;i

如果在资源管理器中转到“我的电脑”,更改为“详细信息”视图并打开“网络位置”列,它似乎与我们通过
ShellFolder
API从“属性”中获得的内容相匹配。不确定“Attributes”来自何处,或者是否在非英语语言环境中更改。

JFileChooser
方法
getSelectedFile()
返回包含此信息的
文件。这对我帮助很大,尽管我需要当前机器的UNC路径,而不是映射驱动器。使用“ipconfig/all”并将其切分应该可以做到这一点。你应该接受上面的编辑,并将其作为答案发布,以获得信任。谢谢你发布解决方案。@trashgood:这里有一些名声在等着你;P.@moonlightcheese:对不起,我刚才忽略了这一点;感谢Zecas的帮助。这是因为windows默认情况下会将映射网络驱动器的驱动器标签设置为
$SHARENAME(\\$SERVER)
。但是,用户可以自由地将此标签更改为完全不同的标签,因此,依赖
ShellFolder.getDisplayName
始终具有此信息是不明智的。好吧,JVM似乎使用
IShellDetails::getDetailsOf
来填充
ShellFolderColumnInfo.title
,正如这里所述,它可以根据区域设置进行更改:但msdn还说,0/1/2/3列始终是名称/大小/类型/日期修改的。Java的ColumnInfo标题与MSDN匹配,但实际上列值表示DiskLabel/Type/Size/FreeSpace。直接索引列可能更方便,即
String uncPath=(String)shellFolder.getFolderColumnValue(6)
还要注意,实际存储类型可能使用的大小列(1)我发现一个本地驱动器报告为“本地磁盘”,一个网络驱动器报告为“网络驱动器”。@PaulTaylor:我已经在上面详细说明了。