1
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。谁能指出我正确的方向?

4

3 回答 3

2

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

hfsdata -e the-alias

在 Java 中,除了调用Runtime.exec(...).

另外,我只是快速检查了一下,您的别名检测功能不起作用。AFAICT,Java 不知道 Finder 别名。如果你真的想支持它们,那么你要么需要使用类似的东西osxutils,要么使用一些特定于平台的代码来读取资源分支(可能会涉及 JNI)。这两个选项都不漂亮。

如果您选择 JNI 路线,请查看Alias Manager 参考文档。相关函数是FSIsAliasFileFSResolveAliasFile

于 2009-06-07T16:49:59.583 回答
1

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

选项数组可用于指示在文件是符号链接的情况下如何处理符号链接。默认情况下,遵循符号链接并读取链接的最终目标的文件属性。如果选项 NOFOLLOW_LINKS 存在,则不遵循符号链接,因此该方法返回符号链接的文件属性。

于 2009-06-07T16:56:57.063 回答
0

大小 = 新文件(file.getCanonicalPath()).length();

于 2009-06-07T16:44:24.427 回答