我尝试从 Mac OSX 上的 Java 访问网络文件夹/UNC 路径。在 Windows 上,以下测试程序运行良好(至少其中一个测试路径):
public class PathTest {
public static void main(String[] args) {
for (String path : Arrays.asList(
"\\\\myserver\\transfer", "//myserver/transfer", "file://myserver/transfer", "smb://myserver/transfer")) {
File f = new File(path);
System.out.println(path + ": " + f.getAbsolutePath() + ", " + f.exists());
Path p = Paths.get(path);
System.out.println(path + ": " + p.toAbsolutePath() + ", " + Files.exists(p));
}
}
}
在 Mac OS 上无法到达文件夹:
\\myserver\transfer: /Users/tim/IdeaProjects/PathTest/\\myserver\transfer, false
//myserver/transfer: /myserver/transfer, false
file://myserver/transfer: /Users/tim/IdeaProjects/PathTest/file://myserver/transfer, false
smb://myserver/transfer: /Users/tim/IdeaProjects/PathTest/smb://myserver/transfer, false
当我使用 Finder 时,我可以使用“smb://myserver/transfer”访问文件夹(使用来宾用户)。怎么了?
编辑添加了NIO.2测试
安装分区并将其作为任何本地目录访问,或者使用专用库,例如JCIFS或Apache Commons VFS。
至少,在 SMB 协议的情况下,您可以以通常的方式安装驱动器(在 Finder 中,按 Command + K,输入您的
smb://
路径,输入您的登录名和密码)并使用 查找文件/Volumes
root 代替主机名,而在 Windows 上主机名保持不变。
假设您已经安装了驱动器
smb://myserver007.company.com/transfer
,并且您可以在 Finder 的绝对根目录中看到它(“Macintosh HD”和“网络”旁边)。
然后你可以像这样读取和处理所需的文件:
File config = Paths.get("/Volumes/transfer", "/innerFolder/file.txt").toFile();
if (config.exists()) {
//some processing logic
}
它适用于 MacOS 11 及更高版本。甚至可能在版本 10 上。