Подтвердить что ты не робот

Как проверить права на запись в каталоге в java?

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

try {
    AccessController.checkPermission(new FilePermission("/tmp/*", "read,write"));
System.out.println("Good");
    // Has permission
} catch (SecurityException e) {
    // Does not have permission
System.out.println("Bad");
}

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

Есть ли альтернатива или какой-то способ выполнить то, что мне нужно?

4b9b3361

Ответ 1

если вы просто хотите проверить, можете ли вы написать:

File f = new File("path");
if(f.canWrite()) {
  // write access
} else {
  // no write access
}

для проверки доступа к чтению существует функция canRead()

Ответ 2

В Java 7 я делаю это так:

if(Files.isWritable(path)){
  //ok, write
}

Docs

Ответ 3

Вы должны использовать только путь к каталогу ("/tmp") для запроса разрешений каталога:

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

С "/tmp/*" вы запрашиваете разрешения всех файлов внутри каталога /tmp.

Ответ 4

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

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

grant codeBase "<location of the codebase>" {
    permission java.io.FilePermission "/tmp/-", "read, write";
};

Ответ 5

Вы хотите проверить разрешения для папки или для файлов в папке?

"/*" в имени пути означает каталог и все файлы, содержащиеся в этом каталоге.

см. javadoc

Ответ 6

java.io.File имеет два метода canRead и canWrite, который должен быть достаточным.

Ответ 7

Это работает нормально:

assertFalse(Files.isWritable(new File("/etc/").toPath()));
assertTrue(Files.isWritable(new File("/tmp/").toPath()));