Wie entpacke ich eine große Zip-Datei mit einer Datei und erhalte den Fortschritt in Bytes mit swift?
Ich versuche, eine große Zip-Datei mit nur einem Element (mehr als 100 MB) zu entpacken und möchte den Fortschritt beim Entpacken anzeigen.
Ich habe Lösungen gefunden, bei denen der Fortschritt anhand der Anzahl der entpackten Dateien ermittelt werden kann. In meinem Fall ist jedoch nur eine große Datei enthalten. Also ich denke, es muss durch die Anzahl der entpackten Bytes bestimmt werden?
Eigentlich verwende ich SSZipArchive mit dem folgenden Code, der gut funktioniert:
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);
Ich habe keine Lösung dafür gefunden.
Hat jemand einen Hinweis, ein Beispiel oder einen Link zu einem Beispiel?
AKTUALISIEREN Der folgende Code sieht so aus, als würde er wie beabsichtigt funktionieren, aber der Handler wird nur einmal aufgerufen (am Ende des Entpackens), wenn die einzige Datei entpackt wird:
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)
}
})
}
UPDATE 2:
Als "Martin R" in SSArchive analysiert, ist es nicht möglich. Gibt es eine andere Möglichkeit, eine Datei zu entpacken und die auf dem Fortschritt basierenden KB anzuzeigen?
UPDATE 3:
Ich habe das SSZipArchive.m geändert, nachdem die Lösung durch "roop" wie folgt erklärt wurde. Wahrscheinlich kann dies auch jemand anderes verwenden:
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;
}
}