mkdirs создает файл вместо создания папки [JAVA]

У меня возникла проблема при распаковке файла, я получаю сообщение об ошибке "Ошибка открытия: ENOTDIR (не каталог)". После отладки я обнаружил, что проблема в этой функции:
После того, как я определил, что текущий ZipEntry Каталог, я вызываю эту функцию с ее путем:

private void dirChecker(String dir) {
        File FiledirChecker = new File(PATH + dir); // PATH+dir = /mnt/sdcard/Pictures/Hafs

        if (!FiledirChecker.isDirectory())
            FiledirChecker.mkdirs();
    }

После того, как эта функция закончилась, я перешел в каталог изображений, и Hafs не является каталогом, а представляет собой файл размером 0 байт, который называется «Hafs».

Почему это происходит?

Я должен указать, что для других каталогов (кроме «Hafs») mkdirs обычно создает папку! но только для этого каталога (Hafs) mkdirs создает не каталог, а файл!


person Omar    schedule 15.08.2012    source источник
comment
Вы проверили этот пост?   -  person assylias    schedule 15.08.2012
comment
@assylias Да, у меня уже есть это разрешение.   -  person Omar    schedule 15.08.2012
comment
Запустите в отладчике или добавьте операторы печати и узнайте, действительно ли вызывается File(Hafs).mkdirs() (может и не быть). Аналогично, добавьте проверки в часть кода, распаковывающую файлы, чтобы убедитесь, что он случайно не распаковывается как файл (вероятно, так оно и есть).   -  person Ernest Friedman-Hill    schedule 15.08.2012
comment
@ErnestFriedman-Hill уже сделал это, и действительно вызывается File(/mnt/sdcard/Pictures/Hafs).mkdirs().. Я не знаю, почему только этот каталог создает проблему, а не 4 других каталога!   -  person Omar    schedule 15.08.2012
comment
Но проверяли ли вы, что сначала не создается файл нулевого размера? mkdirs() завершится ошибкой без уведомления — она просто возвращает логическое значение в случае ошибки — и вы не проверяете возвращаемое значение.   -  person Ernest Friedman-Hill    schedule 15.08.2012
comment
@ErnestFriedman-Hill Это было причиной. Я исправил небольшую ошибку в другом месте, и теперь она работает. Вы были первым, кто оставил комментарий с правильным ответом, опубликуйте ответ, если хотите, чтобы я принял ваш ответ.   -  person Omar    schedule 15.08.2012
comment
Я думаю, что должно быть, если (FiledirChecker.isDirectory()) FiledirChecker.mkdirs();   -  person andy    schedule 15.08.2012


Ответы (2)


Это происходит потому, что в другом месте кода уже создан пустой файл.

Или файл остался от вашего последнего запуска, когда ваш код не мог создавать каталоги.

person Aaron Digulla    schedule 15.08.2012

Если я ничего не пропущу, ваш файл уже создан где-то еще.
Согласно тому, что я вижу в вашем коде
1) вы проверяете, НЕ является ли файл каталогом
2) если 1) верно, вы пытаетесь для создания полной структуры каталогов и каталога с тем же именем, что и файл, который может уже существовать.

person Germann Arlington    schedule 15.08.2012
comment
Это стандартная идиоматика. объект File представляет собой путь, который, возможно, не существует. Если это не каталог, то создайте его как таковой. Это правда, что если файл существует, но не является каталогом, то это попытается (и потерпит неудачу) создать каталог. - person Ernest Friedman-Hill; 15.08.2012
comment
Но правильным подходом было бы проверить File.exists(), а НЕ File.isDirectory() - person Germann Arlington; 15.08.2012