Java сообщает псевдоним (символическая ссылка) как размер 0 на Mac OSX. Как я могу получить истинный размер файла? - PullRequest
1 голос
/ 07 июня 2009
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 ]

2 голосов
/ 07 июня 2009

Псевдонимы Finder совсем не похожи на обычные символические ссылки. Инструменты * nix в OS X вообще не знают псевдонимов, потому что, я думаю, они хранятся в ветке ресурсов. Если вы устанавливаете osxutils, вы можете использовать эту команду оболочки для получения цели псевдонима:

hfsdata -e the-alias

Из Java я не знаю лучшего способа сделать это, кроме как вызвать Runtime.exec(...).

Кроме того, я просто сделал быструю проверку, и ваша функция обнаружения псевдонимов не работает. AFAICT, Java не знает псевдонимов Finder. Если вы действительно хотите их поддерживать, то вам нужно либо использовать что-то вроде osxutils, либо использовать какой-то платформо-зависимый код для чтения веток ресурсов (возможно, с использованием JNI). Ни один из вариантов не хорош.

Если вы идете по маршруту JNI, ознакомьтесь с документацией Справочник по псевдониму менеджера . Соответствующие функции: FSIsAliasFile и FSResolveAliasFile.

1 голос
/ 07 июня 2009

Вы можете использовать интерфейс FileRef из API O'Reilly Java NIO . Я считаю, что метод getAttribute () может обрабатывать символические ссылки, как вы хотите, но я не пробовал его на Mac OSX. Из документов :

Массив опций может использоваться для указать, как символические ссылки обрабатывается для случая, когда файл символическая ссылка. По умолчанию символический ссылки следуют и файл атрибут конечной цели ссылка прочитана. Если вариант NOFOLLOW_LINKS присутствует тогда символические ссылки не идут и так метод возвращает атрибут файла символической ссылки.

0 голосов
/ 07 июня 2009

размер = новый файл (file.getCanonicalPath ()). Length ();

...