Я пытаюсь распаковать большой 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);
Я не нашел для этого решений.
Есть ли у кого-нибудь подсказка, образец или ссылка на образец?
UPDATE: Следующий код выглядит так, как будто он будет работать по назначению, но обработчик будет вызываться только один раз (в конце разархивирования), когда только один файл распаковывается:
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:
Поскольку "Martin R" проанализирован в SSArchive, его невозможно. Есть ли другой способ распаковать файл и показать на основе kbytes?
ОБНОВЛЕНИЕ 3:
Я изменил SSZipArchive.m после того, как решение было объяснено "roop" следующим образом. Возможно, кто-то еще может это использовать:
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;
}
}