mkdirs возвращает false для каталога на SD-карте, в то время как родительский каталог доступен для записи - PullRequest
19 голосов
/ 31 октября 2010

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

(я обнаружил похожие проблемы, вызванные отсутствием разрешения WRITE_EXTERNAL_STORAGE, оно есть и работает почти для всех пользователей, поэтому я не думаю, что это причина)

Я упростил предыдущую ситуацию, чтобы ее было легче объяснить. Если создание директории не удается, я запускаю тестовый пример, в котором я пытаюсь создать каталог .test на SD-карте:

new File(Environment.getExternalStorageDirectory(), ".test").mkdir() -> false
new File(Environment.getExternalStorageDirectory(), ".test").mkdirs() -> false

Свойства файлов соответствующих каталогов:

/ sdcard / .test (существует = false canWrite = false canRead = false canExecute = ошибка isDirectory = false isFile = false)

/ sdcard (существует = true canWrite = true canRead = true canExecute = err isDirectory = true isFile = false)

/ (существует = true canWrite = false canRead = true canExecute = ошибка isDirectory = true isFile = false)

getExternalStorageState = установлен

(canExecute возвращает ошибку, поскольку тест выполняется на SDK <9) </p>

Предложения и идеи приветствуются ...

Ответы [ 12 ]

0 голосов
/ 18 сентября 2014

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

0 голосов
/ 08 апреля 2011

Я столкнулся с подобной проблемой при использовании mkdirs (), однако, потому что при запуске команды:

mkdir one / two

не работает в Linux, затем API (http://download.oracle.com/javase/1.4.2/docs/api/java/io/File.html#mkdirs()) впоследствии тоже терпит неудачу. Думаю, это означает, что нет способа использовать mkdirs на Android? Мой (вероятно, довольно хакерский) обходной путь заключался в создании каждого необходимого каталога отдельно:

String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
new File(extStorageDirectory + "/one/").mkdirs();
new File(extStorageDirectory + "/one/two/).mkdirs();
...