Как проверить права на запись в директорию в Java?
Заголовок: Проверка прав чтения/записи для директории в Java
Я хочу получить фрагмент кода, который проверяет, есть ли у директории права на чтение/запись, и выполняет одно действие, если права есть, и другое действие, если их нет. Я попробовал пример, показанный здесь:
try {
AccessController.checkPermission(new FilePermission("/tmp/*", "read,write"));
System.out.println("Good");
// Права предоставлены
} catch (SecurityException e) {
// Права не предоставлены
System.out.println("Bad");
}
Проблема в том, что исключение всегда срабатывает, и в итоге всегда выводится "Bad", независимо от того, есть ли у директории права на запись или нет. (Я менял права директории на 777 и 000 для тестирования).
Есть ли альтернатива или способ добиться того, что мне нужно?
5 ответ(ов)
Если вы хотите проверить, есть ли у вас доступ на запись к файлу, вы можете использовать следующий код:
File f = new File("path");
if(f.canWrite()) {
// доступ на запись
} else {
// нет доступа на запись
}
Для проверки доступа на чтение существует метод canRead()
. Вы можете использовать его аналогично:
if(f.canRead()) {
// доступ на чтение
} else {
// нет доступа на чтение
}
Таким образом, просто используйте canWrite()
для проверки прав на запись и canRead()
для проверки прав на чтение.
Вы должны использовать только путь к директории ("/tmp"
), чтобы запросить права доступа к директории:
AccessController.checkPermission(new FilePermission("/tmp", "read,write"));
Используя "/tmp/*"
, вы запрашиваете права доступа ко всем файлам внутри директории /tmp
.
Java использует свою собственную модель разрешений, основанную на классах AccessController
и Permission
. Разрешения предоставляются исходному коду (местоположению, откуда загружаются классы), и в большинстве случаев эти разрешения отличаются от разрешений, необходимых для доступа к ресурсам.
Например, даже если вы предоставили всем пользователям права на чтение и запись в директорию /tmp
, этого недостаточно для того, чтобы AccessController
разрешил вашему коду получить необходимые права. Вам также необходимо добавить правило в файл политики, который используется AccessController
, для получения разрешений на чтение и запись файлов в директории /tmp
. Правило, которое нужно создать, будет выглядеть следующим образом:
grant codeBase "<местоположение исходного кода>" {
permission java.io.FilePermission "/tmp/-", "read, write";
};
Таким образом, чтобы корректно настроить разрешения, убедитесь, что у вас есть необходимые записи в файле политики.
Да, это выглядит корректно. Ваша реализация проверяет, является ли заданный путь записываемым, используя методы Files.isWritable()
.
В первом случае вы проверяете путь /etc/
, который обычно не является записываемым для обычных пользователей, поэтому assertFalse
действительно ожидаемое поведение.
Во втором случае, путь /tmp/
обычно предоставляется для записи, что делает assertTrue
уместным.
Таким образом, ваш код корректно выполняет проверку доступности записи для указанных директорий.
На русском, в стиле ответа на StackOverflow, это может выглядеть так:
if (DocumentFile.fromFile(file).canWrite()) {
// Доступ разрешен
...
} else {
// Доступ запрещен
...
}
В данном примере проверяется, разрешено ли запись в файл, используя метод canWrite()
класса DocumentFile
. Если доступ к записи разрешен, выполняется код в первой части условия, иначе — в блоке else
. Убедитесь, что у вас есть необходимые разрешения для работы с файлами в вашем приложении.
Инициализация ArrayList в одну строчку
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Как объявить массив в одну строку?
Загрузка JDK Java на Linux через wget приводит к отображению страницы лицензии вместо установки
Создание репозитория Spring без сущности