Como descompactar um arquivo zip grande contendo um arquivo e obter o progresso em bytes com swift?
Tento descompactar um arquivo zip grande contendo apenas um item (mais de 100 MB) e gostaria de mostrar o progresso durante o descompactação.
Encontrei soluções em que o progresso pode ser determinado com base na quantidade de arquivos descompactados, mas no meu caso, tenho apenas um arquivo grande. Então eu acho que deve ser determinado pela quantidade de bytes descompactados?
Na verdade, estou usando o SSZipArchive com o seguinte código, que funciona bem:
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);
Não encontrei soluções para isso.
Alguém tem uma dica, amostra ou link para uma amostra?
ATUALIZAR: O código a seguir parece funcionar como planejado, mas o manipulador será chamado apenas uma vez (no final do descompactação) quando o único arquivo for descompactado:
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)
}
})
}
ATUALIZAÇÃO 2:
Como "Martin R" analisou no SSArchive, não é possível. Existe alguma outra maneira de descompactar um arquivo e mostrar os kbytes baseados no progresso?
ATUALIZAÇÃO 3:
Alterei o SSZipArchive.m depois que a solução foi explicada por "roop" da seguinte maneira. Provavelmente alguém também pode usar isso:
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;
}
}