想知道是否有办法从JFileChooser中选择的文件返回UNC路径。我将要选择的文件将驻留在具有UNC路径的映射驱动器上。现在,我似乎只能拉回映射驱动器的驱动器号。如何从JFileChooser中检索UNC路径而不是映射的驱动器路径
回答
JFileChooser
方法getSelectedFile()
返回一个File
,它可能有帮助的信息。
“对于Microsoft Windows平台,... UNC路径名的前缀为"\\\\"
;主机名和共享名称是名称序列中的前两个名称。”
请扩展,它如何具有此信息? – 2017-09-07 20:05:32
@PaulTaylor:我已经阐述过了。 – trashgod 2017-09-07 21:57:08
如果其他人正在寻找备用(我认为更简单)的解决方案, 您可以使用ShellFolder.getDisplayName()找到信息。
System.out.println(ShellFolder.getShellFolder(new File(filePath.substring(0,3))).getDisplayName());
这也可能是有用的:例如,你可以从字符串这里分析的驱动器的网络位置
File.listRoots();
这是可行的,因为默认情况下,Windows映射的网络驱动器将驱动器标签设置为'$ SHARENAME(\\ $ SERVER)'。然而,用户可以自由地将此标签更改为完全不同的标签,因此依靠“ShellFolder.getDisplayName”始终拥有此信息是不明智的。 – sqweek 2016-08-09 04:10:42
从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]);
}
}
当我评论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以匹配“属性”我们得到什么。不确定“属性”来自哪里,或者它是否在非英语语言环境中更改。
确定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
另请注意,Size列(1)真的存储类型可能会被使用,我发现一个本地驱动器报告“本地磁盘”和网络驱动器报告“网络驱动器” – 2017-09-08 08:43:02
- 1. 使用C#,如何获取“Application.StartupPath”以返回映射的驱动器路径而不是UNC路径?
- 2. 从模拟后的映射驱动器号获取UNC路径
- 3. 从本地路径或映射路径获取UNC路径
- 4. 如何使用映射的驱动器路径而不是真正的路径使Powershell输出文件路径?
- 5. 获取映射驱动器的UNC路径VB.net
- 6. 如何将具有驱动器号的路径转换为UNC路径
- 7. File.Copy从UNC路径(同一服务器)UNC路径查询
- 8. 如何确定映射驱动器的实际路径?
- 9. 从UNC路径获取本地路径
- 10. OneDrive UNC路径
- 11. Path.GetDirectoryName UNC路径
- 12. 如何从服务器驱动器获取映像路径
- 13. 无法映射路径'/ doc'。 server.map路径
- 14. PhpStorm映射路径
- 15. 检测路径是否在Windows映射的网络驱动器上
- 16. 编写批处理以更改映射驱动器的路径
- 17. 从unc路径Acess exe
- 18. 从UNC路径检索服务器名称
- 19. 如何从当前路径而不是脚本路径导入?
- 20. 将路径转换为UNC路径
- 21. 将HTTP路径转换为UNC路径?
- 22. 如何在Java应用程序中获取映射网络驱动器的UNC路径
- 23. wcf svclog unc路径?
- 24. Response.Redirect到UNC路径
- 25. forfiles与UNC路径
- 26. 如何从UNC路径使用部分?
- 27. Powershell使用映射驱动器作为根路径
- 28. WSH映射驱动器叶默认路径集
- 29. 无法使用路径和密码映射网络驱动器
- 30. 查找网络驱动器的UNC路径?
'JFileChooser'方法'getSelectedFile()'返回一个具有这个信息的'File'。 – trashgod 2011-04-19 21:12:50
这帮了我很多,虽然我需要当前机器的UNC路径,而不是映射驱动器。使用'ipconfig/all'并切片就可以了。你应该在上面进行编辑并将其作为获得信誉的答案。感谢您发布解决方案。 – moonlightcheese 2012-03-08 21:38:56
@trashgod:这里有一些名声在等着你; P。 – Zecas 2012-05-28 09:05:48