Kotlin распакуйте z-каталог MA C - PullRequest
0 голосов
/ 04 марта 2020

Я работаю с kotlin, пытаясь распаковать файл, проблема в том, что файл был заархивирован из файла c, поэтому я получаю некоторые странные вещи. ZIP-файл находится в папке ресурсов, и вот как я к нему обращаюсь:

val destination = applicationContext.getFilesDir().getAbsolutePath()
        println(destination)
        val stream = applicationContext.getAssets().open("MPNC3Dn6UZ8c.zip")
        unzip(stream, destination)

fun unzip(stream: InputStream, destination: String) {
        dirChecker(destination, "")
        val buffer = ByteArray(BUFFER_SIZE)
        try {
            val zis = ZipInputStream(stream)
            var ze: ZipEntry? = null

        while ({ ze = zis.nextEntry; ze }() != null) {
            Log.v("tag", "Unzipping " + ze!!.name)

            if (ze!!.isDirectory) {
                dirChecker(destination, ze!!.name)
            }
            else {
                val f = File(destination, ze!!.name)
                println(ze!!.name)
                if (!f.exists()) {
                    val success = f.createNewFile()
                    if (!success) {
                        Log.w("tag", "Failed to create file " + f.name)
                        continue
                    }
                    val fout = FileOutputStream(f)
                    var count: Int = 0
                    while ({ count = zis.read(buffer); count }() != -1) {
                        fout.write(buffer, 0, count)
                    }
                    zis.closeEntry()
                    fout.close()
                }
            }

        }
        zis.close()
    } catch (e: Exception) {
        Log.e("tag", "unzip", e)
    }
}

private fun dirChecker(destination: String, dir: String) {
    val f = File(destination, dir)

    if (!f.isDirectory) {
        val success = f.mkdirs()
        println(f.name)
        if (!success) {
            Log.w("tag", "Failed to create folder " + f.name)
        }
    }
}

Проблема в том, что я получил cra * sh в этой строке: val success = f.createNewFile(), и ошибка: java .io.IOException: Нет такого файла или каталога. я знаю, что это означает, что файл не существует, но log.v от имени !! !!. дают мне: Разархивирование __MACOSX /._ MPNC3Dn6UZ8 c. Принимая во внимание, что println (ze !!. Name) оправдывает перед тем, как cra sh даст мне: ._MPNC3Dn6UZ8 c

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

РЕДАКТИРОВАТЬ

Я попытался жестко запрограммировать имя как это: val f = File(destination, "MPNC3Dn6UZ8c") с этим я не получаю ошибку, и, кажется, распаковать все файлы, которые я получаю: распаковка MPNC3Dn6UZ8c / images / image_0016_0018.jpg и так далее для всех моих файлов.

Проблема в том, когда я хочу проверить это следующим образом:

val file = File(filesDir.absolutePath).walk().forEach { println(it) }

Чтобы увидеть, были ли созданы эти файлы, только каталог, и я не вижу никаких файлов. Так это из-за __MACOSX / и, может быть, я их не знаю, или они могут быть скрыты или что-то?

Я также заметил, что когда я go в данных приложения, используя настройки-> Приложение ... я видно, что данные имеют размер 80Ко, где мой исходный каталог - 800Ко, поэтому я думаю, что распаковка не сработала так, как ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...