我正在与Kotlin一起尝试解压缩文件,问题是该文件是从Mac压缩的,所以我得到了一些奇怪的东西。 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)
}
}
}
问题是我在此行崩溃:val success = f.createNewFile()
,错误是:java.io.IOException:没有这样的文件或目录。我知道这意味着该文件不存在,但是ze !!。name的log.v给了我:解压缩__MACOSX /._ MPNC3Dn6UZ8c。而崩溃前的println(ze !!。name)正好给我:._MPNC3Dn6UZ8c
我认为该错误是由于名称之间的差异所致,但我在文件和__MACOSX /之前执行了._吗?我该如何解决?
编辑
我尝试将这样的名称硬编码为val f = File(destination, "MPNC3Dn6UZ8c")
,但没有错误,而且似乎在解压缩所有文件时就解压缩了MPNC3Dn6UZ8c / images / image_0016_0018.jpg,以此类推。文件。
问题是当我想像这样验证它时:
val file = File(filesDir.absolutePath).walk().forEach {
println(it)
}
要查看这些文件是否仅创建目录,而我没有看到任何文件。那是因为__MACOSX /,也许我不是他们,或者他们可能被藏起来了吗?
我还注意到,当我使用设置->应用程序进入应用程序数据时...我看到数据是80Ko,而我的原始目录是800Ko,所以我认为解压缩没有按预期进行。