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

Проверка доступа на запись в каталоге перед созданием файлов внутри него

Мое небольшое приложение-утилита запрашивает у пользователя выходной каталог через селектор файлов GUI. Затем он создает много файлов в этом выходном каталоге после некоторой обработки.

Мне нужно проверить, имеет ли приложение доступ на запись, чтобы он информировал пользователя и делал не продолжайте обработку (что может занять много времени)

Моя первая попытка - метод canWrite() java.io.File. Но это не работает поскольку он касается самой записи каталога, а не ее содержимого. Я видел хотя бы один экземпляр папки Windows XP, которую можно переименовать или удалить, но файлы не могут быть созданы в нем (из-за разрешений). Это на самом деле моя тестовая версия.

Наконец, я решил следующее решение

//User places the input file in a directory and selects it from the GUI
//All output files will be created in the directory that contains the input file
File fileBrowse = chooser.getSelectedFile(); //chooser is a JFileChooser
File sample = new File(fileBrowse.getParent(),"empty.txt"); 
try
{
     /*
      * Create and delete a dummy file in order to check file permissions. Maybe 
      * there is a safer way for this check.
      */
      sample.createNewFile();
      sample.delete();
}
catch(IOException e)
{
      //Error message shown to user. Operation is aborted
}

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

Я подозреваю, что для этого должен быть лучший способ, но все решения, которые я нашел до сих пор с менеджерами по безопасности и т.д. с Java-апплетами, а не с автономными приложениями. Я что-то пропустил?

Каков рекомендуемый способ проверки доступа к файлам внутри каталога до на самом деле писать файлы?

Я использую Java 5.

4b9b3361

Ответ 1

Вы можете проверить права доступа к файлам, убедиться, что каталог существует, и выполнить большую проверку или найти библиотеку, которая делает все, что вас проверяет. НО (!) не лучший способ проверить, чтобы попробовать? Если вы проверите разрешения и изменения файловой системы... вам придется изменить свой код. Но попытка написать файл ВСЕГДА скажет вам, можете ли вы записать файл.

Ваше решение не обязательно должно быть самым элегантным. Это не дешевый жесткий кодированный патч или что-то уродливое. Это просто нормальный код. И это всегда будет работать. Но если вам не нравится видеть, что проверка кода просто отделяет его, помещая его в класс, цель которого - проверить возможность записи. Фактически, вы должны поместить его в полезный класс, чтобы вы любили элегантность или нет.

Другим решением было бы поместить весь ваш код для записи в жесткий диск в попытке. И если вы не можете писать, вся часть будет пропущена, и вы дадите обратную связь пользователю с сообщением в ловушке.

Ответ 2

он не работает, даже если вы вызываете canWrite на конечный путь ?

File sample = new File(fileBrowse.getParent(),"empty.txt"); 

if (sample.canWrite()) {
    doSomethingUseful(sample);
} else {
    notifyUser();
}

Ответ 3

вы можете использовать FilePermission, чтобы получить подробную информацию. Я нахожу один способ, когда вам нужно реализовать SecurityManager код здесь и здесь

Ответ 4

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

Ответ 5

Используя Java 1.8, я смог использовать следующее.

Set<PosixFilePermission> permissions = Files.getPosixFilePermissions(Paths.get(destDir), LinkOption.NOFOLLOW_LINKS);
Assert.assertTrue("User did not have read permission.", permissions.contains(PosixFilePermission.OWNER_READ));
Assert.assertTrue("User did not have execute permission.", permissions.contains(PosixFilePermission.OWNER_EXECUTE));
Assert.assertTrue("User did not have write permission.", permissions.contains(PosixFilePermission.OWNER_WRITE));

Assert.assertFalse("Group did have read permission.", permissions.contains(PosixFilePermission.GROUP_READ));
Assert.assertFalse("Group did have execute permission.", permissions.contains(PosixFilePermission.GROUP_EXECUTE));
Assert.assertFalse("Group did have write permission.", permissions.contains(PosixFilePermission.GROUP_WRITE));

Assert.assertFalse("Others did have read permission.", permissions.contains(PosixFilePermission.OTHERS_READ));
Assert.assertFalse("Others did have execute permission.", permissions.contains(PosixFilePermission.OTHERS_EXECUTE));
Assert.assertFalse("Others did have write permission.", permissions.contains(PosixFilePermission.OTHERS_WRITE));