Sample code for 30+ languages & platforms
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

Swift

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)")

}