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

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

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

Моей первой попыткой был метод 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.


person kazanaki    schedule 13.08.2009    source источник
comment
Что делать, если файл empty.txt уже существует? Затем вы в конечном итоге удаляете файл, который, возможно, был важен.   -  person Jeff Irwin    schedule 13.01.2016
comment
Да, было бы лучше, если бы логическое значение, возвращаемое createNewFile(), использовалось, чтобы понять, действительно ли файл был создан или нет.   -  person kazanaki    schedule 14.01.2016


Ответы (4)


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

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

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

person Philippe Carriere    schedule 13.08.2009

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

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

if (sample.canWrite()) {
    doSomethingUseful(sample);
} else {
    notifyUser();
}
person dfa    schedule 13.08.2009
comment
Это не так, потому что canWrite также проверяет, существует ли файл. Это не относится к вашему коду. Это упоминается в javadoc. - person kazanaki; 13.08.2009

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

person urmalp    schedule 13.08.2009
comment
Я посмотрел на FilePermission, но мне кажется, что он используется в апплетах для предоставления доступа к файлам. У вас есть пример с автономными приложениями? - person kazanaki; 14.08.2009

Используя 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));
person ElectronicBlacksmith    schedule 26.11.2017