Swift
Swift
Decompress Large Text File in Blocks
See more Compression Examples
Decompresses a large text file in blocks, and compares the restored (decompressed) file with the original to make sure it's correct.Chilkat Swift Downloads
func chilkatTest() {
var success: Bool = false
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
// First, let's compress a text file.
// We'll then decompress in blocks, and compare the decompressed with the original file.
// Compress a text file:
let compress = CkoCompression()!
compress.algorithm = "deflate"
success = compress.compressFile(srcPath: "qa_data/hamlet.xml", destPath: "qa_data/hamlet_compressed.dat")
if success == false {
print("\(compress.lastErrorText!)")
return
}
let fac = CkoFileAccess()!
// Examine the uncompressed and compressed sizes:
var originalPath: String? = "qa_data/hamlet.xml"
// Note: The FileSize method returns a signed 32-bit integer. If the file is potentially larger than 2GB, call FileSizeStr instead to return
// the size of the file as a string, then convert to an integer value.
print("uncompressed size: \(fac.fileSize(path: originalPath).intValue)")
print("compressed size: \(fac.fileSize(path: "qa_data/hamlet_compressed.dat").intValue)")
// Decompress in blocks..
let facSrc = CkoFileAccess()!
let facDest = CkoFileAccess()!
facSrc.open(forRead: "qa_data/hamlet_compressed.dat")
// If we compress in 32K chunks, find out how many blocks there will be.
var blockSize: Int = 32768
var numBlocks: Int = facSrc.getNumBlocks(blockSize: blockSize).intValue
// Open an output file for the decompressed data.
var restoredPath: String? = "qa_output/hamlet_restored.xml"
success = facDest.open(forWrite: restoredPath)
if success == false {
print("\(facDest.lastErrorText!)")
return
}
var decompressedStr: String?
var compressedBytes: NSData
// Assuming numBlocks > 1
compress.firstChunk = true
compress.lastChunk = false
var i: Int = 0
while i < numBlocks {
compressedBytes = facSrc.readBlock(blockIndex: i, blockSize: blockSize)
decompressedStr = compress.decompressString(bData: compressedBytes)
facDest.appendText(text: decompressedStr, charset: "utf-8")
i = i + 1
compress.firstChunk = false
if i == (numBlocks - 1) {
compress.lastChunk = true
}
}
facSrc.fileClose()
facDest.fileClose()
// Examine the size of the restored file.
print("restored size: \(fac.fileSize(path: restoredPath).intValue)")
// Compare the contents of the original with the restored.
var bEqualContents: Bool = fac.fileContentsEqual(path1: restoredPath, path2: originalPath)
print("Contents Equal: \(bEqualContents)")
}