0

Как проверить права на запись в директорию в Java?

11

Заголовок: Проверка прав чтения/записи для директории в Java

Я хочу получить фрагмент кода, который проверяет, есть ли у директории права на чтение/запись, и выполняет одно действие, если права есть, и другое действие, если их нет. Я попробовал пример, показанный здесь:

try {
    AccessController.checkPermission(new FilePermission("/tmp/*", "read,write"));
    System.out.println("Good");
    // Права предоставлены
} catch (SecurityException e) {
    // Права не предоставлены
    System.out.println("Bad");
}

Проблема в том, что исключение всегда срабатывает, и в итоге всегда выводится "Bad", независимо от того, есть ли у директории права на запись или нет. (Я менял права директории на 777 и 000 для тестирования).

Есть ли альтернатива или способ добиться того, что мне нужно?

5 ответ(ов)

0

Если вы хотите проверить, есть ли у вас доступ на запись к файлу, вы можете использовать следующий код:

File f = new File("path");
if(f.canWrite()) {
  // доступ на запись
} else {
  // нет доступа на запись
}

Для проверки доступа на чтение существует метод canRead(). Вы можете использовать его аналогично:

if(f.canRead()) {
  // доступ на чтение
} else {
  // нет доступа на чтение
}

Таким образом, просто используйте canWrite() для проверки прав на запись и canRead() для проверки прав на чтение.

0

Вы должны использовать только путь к директории ("/tmp"), чтобы запросить права доступа к директории:

AccessController.checkPermission(new FilePermission("/tmp", "read,write"));

Используя "/tmp/*", вы запрашиваете права доступа ко всем файлам внутри директории /tmp.

0

Java использует свою собственную модель разрешений, основанную на классах AccessController и Permission. Разрешения предоставляются исходному коду (местоположению, откуда загружаются классы), и в большинстве случаев эти разрешения отличаются от разрешений, необходимых для доступа к ресурсам.

Например, даже если вы предоставили всем пользователям права на чтение и запись в директорию /tmp, этого недостаточно для того, чтобы AccessController разрешил вашему коду получить необходимые права. Вам также необходимо добавить правило в файл политики, который используется AccessController, для получения разрешений на чтение и запись файлов в директории /tmp. Правило, которое нужно создать, будет выглядеть следующим образом:

grant codeBase "<местоположение исходного кода>" {
    permission java.io.FilePermission "/tmp/-", "read, write";
};

Таким образом, чтобы корректно настроить разрешения, убедитесь, что у вас есть необходимые записи в файле политики.

0

Да, это выглядит корректно. Ваша реализация проверяет, является ли заданный путь записываемым, используя методы Files.isWritable().

В первом случае вы проверяете путь /etc/, который обычно не является записываемым для обычных пользователей, поэтому assertFalse действительно ожидаемое поведение.

Во втором случае, путь /tmp/ обычно предоставляется для записи, что делает assertTrue уместным.

Таким образом, ваш код корректно выполняет проверку доступности записи для указанных директорий.

0

На русском, в стиле ответа на StackOverflow, это может выглядеть так:

if (DocumentFile.fromFile(file).canWrite()) {
    // Доступ разрешен
    ...
} else {
    // Доступ запрещен
    ...
}

В данном примере проверяется, разрешено ли запись в файл, используя метод canWrite() класса DocumentFile. Если доступ к записи разрешен, выполняется код в первой части условия, иначе — в блоке else. Убедитесь, что у вас есть необходимые разрешения для работы с файлами в вашем приложении.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь