2011-04-19 32 views
4

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

+0

'JFileChooser'方法'getSelectedFile()'返回一个具有这个信息的'File'。 – trashgod 2011-04-19 21:12:50

+0

这帮了我很多,虽然我需要当前机器的UNC路径,而不是映射驱动器。使用'ipconfig/all'并切片就可以了。你应该在上面进行编辑并将其作为获得信誉的答案。感谢您发布解决方案。 – moonlightcheese 2012-03-08 21:38:56

+0

@trashgod:这里有一些名声在等着你; P。 – Zecas 2012-05-28 09:05:48

回答

2

JFileChooser方法getSelectedFile()返回一个File,它可能有帮助的信息。

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

+0

请扩展,它如何具有此信息? – 2017-09-07 20:05:32

+0

@PaulTaylor:我已经阐述过了。 – trashgod 2017-09-07 21:57:08

1

如果其他人正在寻找备用(我认为更简单)的解决方案, 您可以使用ShellFolder.getDisplayName()找到信息。

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

这也可能是有用的:例如,你可以从字符串这里分析的驱动器的网络位置

File.listRoots(); 
+2

这是可行的,因为默认情况下,Windows映射的网络驱动器将驱动器标签设置为'$ SHARENAME(\\ $ SERVER)'。然而,用户可以自由地将此标签更改为完全不同的标签,因此依靠“ShellFolder.getDisplayName”始终拥有此信息是不明智的。 – sqweek 2016-08-09 04:10:42

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

如果你去我在资源管理器的电脑,切换到详细信息视图,并打开“网络位置”一栏,它似乎通过ShellFolder API以匹配“属性”我们得到什么。不确定“属性”来自哪里,或者它是否在非英语语言环境中更改。

+0

确定JVM似乎使用'IShellDetails :: getDetailsOf'来填充'ShellFolderColumnInfo.title',这里所述可以根据语言环境改变: https://msdn.microsoft.com/zh-cn/library/windows/桌面/ bb775104%28V = vs.85%29。aspx 但msdn也说列0/1/2/3总是名称/大小/类型/修改日期。 Java的ColumnInfo标题与MSDN匹配,但实际上列值表示DiskLabel/Type/Size/FreeSpace。它可能更便于直接索引列,即'String uncPath =(String)shellFolder.getFolderColumnValue(6);' – sqweek 2016-08-09 05:38:27

+0

另请注意,Size列(1)真的存储类型可能会被使用,我发现一个本地驱动器报告“本地磁盘”和网络驱动器报告“网络驱动器” – 2017-09-08 08:43:02