Это проверило бы на существование каталога также.
File file = new File("c:\\cygwin\\cygwin.bat");
if (!file.isDirectory())
file = file.getParentFile();
if (file.exists()){
...
}
кажется, что file.canWrite () не дает Вам ясный признак, если у Вас есть полномочия записать в каталог.
File.getCanonicalPath()
довольно полезно с этой целью. Исключения IO выдаются для определенных типов недопустимых имен файлов (например, CON
, PRN
, *?*
в Windows) при разрешении против ОС или файловой системы. Однако это только служит предварительной проверкой; необходимо будет все еще обработать другие отказы, на самом деле создавая файл (например, недостаточные полномочия, отсутствие дискового пространства, ограничений безопасности).
Много вещей могут пойти не так, как надо, когда Вы пытаетесь создать файл:
Главное, те могут измениться между тем, когда Вы пытаетесь запросить, чтобы видеть, можете ли Вы и когда Вы на самом деле можете. В многопоточной среде это - одна из основных причин условий состязания и может быть реальной уязвимостью некоторых программ.
В основном просто необходимо попытаться создать его и видеть, работает ли это. И это - корректный способ сделать это. Это - почему вещи как ConcurrentHashMap
имеют putIfAbsent()
так проверка, и вставка является атомарной операцией и не страдает от условий состязания. Точно тот же принцип находится в игре здесь.
, Если это - просто часть некоторой диагностики или процесса установки, просто сделайте это и посмотрите, работает ли это. Снова нет никакой гарантии, что это будет работать позже как бы то ни было.
В основном Ваша программа должна быть достаточно устойчивой для смерти корректно, если она не может записать соответствующий файл.