Каков наилучший способ проверить разрешения на создание файлов в Java - PullRequest
4 голосов
/ 12 сентября 2011

Мне нужно проверить разрешения на создание файлов для определенного каталога.

Я пробовал:

try {
    AccessController.checkPermission(new FilePermission("directory_path", "write"));
    // Have permission
} catch (SecurityException e) {
    // Doesn't have permission
}

... но это всегда вызывает исключение SecurityException (насколько японял, что это проверяет не основные права доступа fs, а некоторые параметры JVM, которые должны быть настроены явно).

Другой возможный способ - использовать что-то вроде этого:

File f = new File("directory_path");
if(f.canWrite()) {
    // Have permission
} else {
    // Doesn't have permission
}

... но это возвращает trueдаже если я не могу создать файл в указанном каталоге (например, я не могу создать файл в "c: \", когда я запускаю свое приложение под пользователем без прав администратора, но f.canWrite () возвращает true).

InВ конце я сделал хак, похожий на этот:

File f = new File("directory_path");
try {
    File.createTempFile("check", null, f).delete();

    // Have permission
} catch (IOException e) {
    // Doesn't have permission
}

... но это может послужить лишь временным решением, так как мне нужно получить такие разрешения почти для всех папок на клиентском компьютере.

Кто-нибудь знает, как получить РЕАЛЬНЫЕ разрешения на создание файлов, не вызывая проблем с производительностью и взломов, описанных выше?

1 Ответ

1 голос
/ 12 сентября 2011

Лучший способ проверить доступность / удобство использования любого ресурса - это попробовать его использовать. В этом случае new FileOutputStream(new File(dir, name)). Он выдаст IOException, если каталог недоступен для записи, или файл уже существует и недоступен для записи, и т. Д. И т. Д. И т. Д. Операционная система уже должна выполнять все эти проверки при выполнении этого кода: нет смысла пытаясь продублировать все это, и даже если вы все сделаете правильно на 100%, что маловероятно, вы все равно вводите временное окно, в котором ранее «истинное» условие может стать «ложным» из-за асинхронной активности. В любом случае вы должны перехватывать исключения из создания файла и писать код в блоке catch для их обработки: зачем писать все это дважды?

...