File file = new File("path to file alias foo");
其中“文件别名foo的路径”是别名报告文件大小为0而不是实际文件大小。我找到了一种测试别名的解决方法:
public boolean isLink() {
try {
if (file.getAbsolutePath().equals(file.getCanonicalPath())) {
return false;
}
} catch (IOException ex) {
logger.severe(ex.getMessage());
}
return true;
}
编辑实际上,此代码无效,正如下面的海报所指出的那样。我试图从linux符号链接示例中调整解决方案,但我没有意识到查找器别名和符号链接不一样。
不!这似乎有效,但......
file.getCanonicalFile().length();
仍然报告文件长度为0.任何人都可以指出我正确的方向吗?
答案 0 :(得分:2)
Finder别名与普通的符号链接完全不同。 OS X上的* nix工具根本不知道别名,因为它们存储在资源分支中,我相信。如果安装osxutils
,则可以使用此shell命令获取别名的目标:
hfsdata -e the-alias
从Java开始,除了调用Runtime.exec(...)
之外,我不知道更好的方法。
另外,我只是做了一个快速检查,你检测别名的功能不起作用。 AFAICT,Java不知道Finder别名。如果确实想要支持它们,那么您将需要使用osxutils
之类的东西,或使用某些特定于平台的代码来读取资源分支(可能涉及JNI)。这两种选择都不是很好。
如果您使用JNI路线,请查看Alias Manager Reference文档。相关功能为FSIsAliasFile
和FSResolveAliasFile
。
答案 1 :(得分:1)
您可以使用O'Reilly FileRef API中的Java NIO界面。我相信getAttribute()方法可以根据需要处理符号链接,但我还没有在Mac OSX上尝试过。来自docs:
可以使用options数组 表明符号链接是如何的 处理文件的情况 象征性的链接。默认情况下,符号 跟随链接和文件 最终目标的属性 链接被读取。如果是选项 NOFOLLOW_LINKS当时在场 没有遵循符号链接等等 该方法返回文件属性 符号链接。
答案 2 :(得分:0)
size = new File(file.getCanonicalPath())。length();