Как распаковать большой zip-файл, содержащий один файл, и получить прогресс в байтах с помощью swift?
Я пытаюсь распаковать большой zip-файл, содержащий только один элемент (более 100 МБ), и мне нравится показывать прогресс во время распаковки.
Я нашел решения, в которых прогресс можно определить по количеству разархивированных файлов, но в моем случае у меня есть только один большой файл внутри. Так что я думаю, это должно быть определено количеством разархивированных байтов?
На самом деле я использую SSZipArchive со следующим кодом, который отлично работает:
var myZipFile:NSString="/Users/user/Library/Developer/CoreSimulator/Devices/mydevice/ziptest/testzip.zip";
var DestPath:NSString="/Users/user/Library/Developer/CoreSimulator/Devices/mydevice/ziptest/";
let unZipped = SSZipArchive.unzipFileAtPath(myZipFile as! String, toDestination: DestPath as! String);
Я не нашел решений для этого.
У кого-нибудь есть подсказка, образец или ссылка на образец?
ОБНОВИТЬ: Следующий код выглядит так, как будто он будет работать так, как задумано, но обработчик будет вызываться только один раз (в конце распаковки), когда разархивирован только один файл:
func unzipFile(sZipFile: String, toDest: String){
SSZipArchive.unzipFileAtPath(sZipFile, toDestination: toDest, progressHandler: {
(entry, zipInfo, readByte, totalByte) -> Void in
println("readByte : \(readByte)") // <- This will be only called once, at the end of unzipping. My 500MB Zipfile holds only one file.
println("totalByte : \(totalByte)")
//Asynchrone task
dispatch_async(dispatch_get_main_queue()) {
println("readByte : \(readByte)")
println("totalByte : \(totalByte)")
//Change progress value
}
}, completionHandler: { (path, success, error) -> Void in
if success {
//SUCCESSFUL!!
} else {
println(error)
}
})
}
ОБНОВЛЕНИЕ 2:
Как анализировал «Мартин Р» в SSArchive, это невозможно. Есть ли другой способ разархивировать файл и показать на основе прогресса в килобайтах?
ОБНОВЛЕНИЕ 3:
Я изменил SSZipArchive.m после того, как решение было объяснено как «рут» следующим образом. Возможно, кто-то еще может использовать это тоже:
FILE *fp = fopen((const char*)[fullPath UTF8String], "wb");
while (fp) {
int readBytes = unzReadCurrentFile(zip, buffer, 4096);
if (readBytes > 0) {
fwrite(buffer, readBytes, 1, fp );
totalbytesread=totalbytesread+4096;
// Added by me
if (progressHandler)
{
progressHandler(strPath, fileInfo, currentFileNumber, totalbytesread);
}
// End added by me
} else {
break;
}
}