Рубрики
Без рубрики

Java – Невозможно назначить разрешение на групповую запись файлу

В Java, чтобы назначить разрешение на файл во время создания файла, сначала создайте файл, а затем назначьте его разрешение на файл.

Автор оригинала: mkyong.

В Java мы можем использовать NIO CreateFile() для назначения разрешения на файл во время создания файла.

package java.nio.file;

public static Path createFile(Path path, FileAttribute... attrs)
       throws IOException

Но, CreateFile() не удается назначить разрешение на запись файла в группу файлу в системе Unix?

  Path path = Paths.get("/home/mkyong/test/runme.sh");
  Set perms =
        PosixFilePermissions.fromString("rwxrwxrwx");

  Files.createFile(path, PosixFilePermissions.asFileAttribute(perms));
$ ls -lsah

0 -rwxr-xr-x  1 mkyong mkyong    0 Jul  20 16:18 runme.sh

Ответ В Java назначьте разрешение на файл во время создания файла, сначала создайте файл, а затем назначьте его разрешение на файл.

  Path path = Paths.get("/home/mkyong/test/runme.sh");

  Files.createFile(path);
  Files.setPosixFilePermissions(path,
          PosixFilePermissions.fromString("rwxrwxrwx"));

1. Разрешение PosixFilePermission. ГРУППОВАЯ ЗАПИСЬ

В этом примере предпринимается попытка назначить разрешение на файл 777 во время создания файла.

package com.mkyong.io.temp;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.EnumSet;
import java.util.Set;

public class CreateFile1 {

    public static void main(String[] args) {

        try {

            Path path = Paths.get("/home/mkyong/test/test1.log");

            Set perms = EnumSet.of(
                    PosixFilePermission.OWNER_READ,
                    PosixFilePermission.OWNER_WRITE,
                    PosixFilePermission.OWNER_EXECUTE,
                    PosixFilePermission.GROUP_READ,
                    PosixFilePermission.GROUP_WRITE,
                    PosixFilePermission.GROUP_EXECUTE,
                    PosixFilePermission.OTHERS_READ,
                    PosixFilePermission.OTHERS_WRITE,
                    PosixFilePermission.OTHERS_EXECUTE
            );

            Files.createFile(path, PosixFilePermissions.asFileAttribute(perms));

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

Вывод, создать файл() не удалось назначить разрешение на запись в файл группы?

$ ls -lsah

total 8.0K
4.0K drwxr-xr-x  2 mkyong mkyong 4.0K Jul  20 16:18 .
4.0K drwxr-xr-x 42 mkyong mkyong 4.0K Jul  20 16:06 ..

   0 -rwxr-xr-x  1 mkyong mkyong    0 Jul  20 16:18 test1.log

2. posixfilepermissions.из строки (“rwxrwxrwx”)

В этом примере используется PosixFilePermissions.fromString для назначения разрешения на файл 777 во время создания файла.

package com.mkyong.io.temp;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Set;

public class CreateTempFile2 {

    public static void main(String[] args) {

        try {

            Path path = Paths.get("/home/mkyong/test/test2.log");

            Set perms =
                    PosixFilePermissions.fromString("rwxrwxrwx");

            Files.createFile(path, PosixFilePermissions.asFileAttribute(perms));

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

Выход – Результат тот же; CreateFile() по-прежнему не может назначить разрешение на запись в файл группы?

$ ls -lsah

total 8.0K
4.0K drwxr-xr-x  2 mkyong mkyong 4.0K Jul  20 16:22 .
4.0K drwxr-xr-x 42 mkyong mkyong 4.0K Jul  20 16:06 ..

   0 -rwxr-xr-x  1 mkyong mkyong    0 Jul  20 16:18 test1.log
   0 -rwxr-xr-x  1 mkyong mkyong    0 Jul  20 16:22 test2.log

3. Сначала Создайте, Назначьте Позже.

Разрешение на файл может быть “переопределено UNIX umask ” (не уверен) во время создания файла.

Чтобы исправить это или получить разрешение на файл desire 777, мы должны сначала создать файл, а затем назначить разрешение на файл.

package com.mkyong.io.temp;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Set;

public class CreateTempFile3 {

    public static void main(String[] args) {

        try {

            Path path = Paths.get("/home/mkyong/test/test3.log");

            /*Set perms = EnumSet.of(
                    PosixFilePermission.OWNER_READ,
                    PosixFilePermission.OWNER_WRITE,
                    PosixFilePermission.OWNER_EXECUTE,
                    PosixFilePermission.GROUP_READ,
                    PosixFilePermission.GROUP_WRITE,
                    PosixFilePermission.GROUP_EXECUTE,
                    PosixFilePermission.OTHERS_READ,
                    PosixFilePermission.OTHERS_WRITE,
                    PosixFilePermission.OTHERS_EXECUTE
            );*/

            Set perms =
                    PosixFilePermissions.fromString("rwxrwxrwx");

            Files.createFile(path);
            Files.setPosixFilePermissions(path, perms);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

Вывод, наконец, мы можем назначить файлу разрешение на запись в группу.

$ ls -lsah

total 8.0K
4.0K drwxr-xr-x  2 mkyong mkyong 4.0K Jul  20 16:27 .
4.0K drwxr-xr-x 42 mkyong mkyong 4.0K Jul  20 16:06 ..

   0 -rwxr-xr-x  1 mkyong mkyong    0 Jul  20 16:18 test1.log
   0 -rwxr-xr-x  1 mkyong mkyong    0 Jul  20 16:22 test2.log

   0 -rwxrwxrwx  1 mkyong mkyong    0 Jul  20 16:27 test3.log

Рекомендации

Оригинал: “https://mkyong.com/java/java-unable-to-assign-group-write-permission-to-a-file/”