Files.createSymbolicLink () принимает массив FileAttribute <?> В качестве аргумента; это имеет смысл на любой ОС?

1

Прототипом Files.createSymbolicLink() является:

static Path createSymbolicLink(Path link, Path target,
    FileAttribute<?>... attrs)

Ну зачем?

Символьная ссылка - это не что иное, как индексный дескриптор, содержимое которого является строкой, указывающей на... Ну, что угодно. Цель может даже быть недействительной вообще.

Из любопытства я попробовал это (да, он работает как корень, но это здесь специально):

root@alustriel:/tmp# cat Test.java
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.*;

public final class Test {
    public static void main(final String... args) throws IOException {
        final UserPrincipalLookupService lookupService =
                FileSystems.getDefault().getUserPrincipalLookupService();

        final UserPrincipal user = lookupService.lookupPrincipalByName("fge");

        final FileAttribute<UserPrincipal> attr =
                new FileAttribute<UserPrincipal>() {
            @Override
            public String name() {
                return "owner:owner";
            }

            @Override
            public UserPrincipal value() {
                return user;
            }
        };

        final Path target = Paths.get("whocares, I don't exist anyway");
        final Path symlink = Paths.get("/tmp/meh");

        Files.createSymbolicLink(symlink, target, attr);
    }
}
root@alustriel:/tmp# javac Test.java 
root@alustriel:/tmp# java Test
Exception in thread "main" java.lang.UnsupportedOperationException: 'owner:owner' not supported as initial attribute
    at sun.nio.fs.UnixFileModeAttribute.toUnixMode(UnixFileModeAttribute.java:74)
    at sun.nio.fs.UnixFileSystemProvider.createSymbolicLink(UnixFileSystemProvider.java:440)
    at java.nio.file.Files.createSymbolicLink(Files.java:996)
    at Test.main(Test.java:41)

Ну, я как бы ожидал этого.

Единственная ситуация, когда я знаю, где существуют разрешения symlink, - это Linux/proc/*/fd/, поскольку разрешения символической ссылки соответствуют разрешениям, с которыми был открыт дескриптор файла. Но это системная символьная ссылка и не похожа на то, что пользователь может генерировать.

Есть ли какая-либо ОС, где актуал разрешения symlink влияет на поведение символической ссылки и/или ее цели каким-либо образом, формой или формой?


edit: ну, я могу изменить владельца символической ссылки с chown но... Опять же, какой смысл?

Теги:
symlink
java.nio.file

1 ответ

2

Документы Oracle говорят, что это просто для будущего использования:

Параметр FileAttributes vararg позволяет указать начальные атрибуты файла, которые задаются атомарно при создании ссылки. Однако этот аргумент предназначен для будущего использования и в настоящее время не реализован. (источник, акцент мой)

На Mac разрешения могут быть установлены, хотя они, похоже, не имеют большого эффекта. Я создал файл, который можно прочитать только с помощью root, и две символические ссылки на него: одно читаемое в мире, одно читаемое только от root. Я мог бы cat файл, используя все три, но ls -l перечислены только цель ссылки на мировой считываемый ссылке, когда я побежал, как мой пользователь:

-rwxrwxrwx 1 root  wheel   7 Dec 21 21:32 actual
lrwxrwxrwx 1 root  wheel   6 Dec 21 21:33 link_for_all -> actual
lrwx------ 1 root  wheel   6 Dec 21 21:34 link_for_root

Я не мог найти никаких других различий в поведении, но это что-то, поэтому, возможно, вы сможете использовать createSymbolicLink для создания такой символической ссылки в будущем.

  • 0
    Ааа, так что вы можете сделать это с Mac ... В Linux, если вы используете chmod символическую ссылку, она аккуратно игнорируется; «разрешения» всегда 777.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню