Java在Mac OSX上将别名(符号链接)报告为大小为0。如何获得真正的文件大小?

时间:2009-06-07 16:35:33

标签: java macos alias symlink

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.任何人都可以指出我正确的方向吗?

3 个答案:

答案 0 :(得分:2)

Finder别名与普通的符号链接完全不同。 OS X上的* nix工具根本不知道别名,因为它们存储在资源分支中,我相信。如果安装osxutils,则可以使用此shell命令获取别名的目标:

hfsdata -e the-alias

从Java开始,除了调用Runtime.exec(...)之外,我不知道更好的方法。

另外,我只是做了一个快速检查,你检测别名的功能不起作用。 AFAICT,Java不知道Finder别名。如果确实想要支持它们,那么您将需要使用osxutils之类的东西,或使用某些特定于平台的代码来读取资源分支(可能涉及JNI)。这两种选择都不是很好。

如果您使用JNI路线,请查看Alias Manager Reference文档。相关功能为FSIsAliasFileFSResolveAliasFile

答案 1 :(得分:1)

您可以使用O'Reilly FileRef API中的Java NIO界面。我相信getAttribute()方法可以根据需要处理符号链接,但我还没有在Mac OSX上尝试过。来自docs

  

可以使用options数组   表明符号链接是如何的   处理文件的情况   象征性的链接。默认情况下,符号   跟随链接和文件   最终目标的属性   链接被读取。如果是选项   NOFOLLOW_LINKS当时在场   没有遵循符号链接等等   该方法返回文件属性   符号链接。

答案 2 :(得分:0)

size = new File(file.getCanonicalPath())。length();