Sample code for 30+ languages & platforms
Go

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 Go Downloads

Go
    success := 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:
    compress := chilkat.NewCompression()
    compress.SetAlgorithm("deflate")

    success = compress.CompressFile("qa_data/hamlet.xml","qa_data/hamlet_compressed.dat")
    if success == false {
        fmt.Println(compress.LastErrorText())
        compress.DisposeCompression()
        return
    }

    fac := chilkat.NewFileAccess()

    // Examine the uncompressed and compressed sizes:
    originalPath := "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.
    fmt.Println("uncompressed size: ", fac.FileSize(originalPath))
    fmt.Println("compressed size: ", fac.FileSize("qa_data/hamlet_compressed.dat"))

    // Decompress in blocks..
    facSrc := chilkat.NewFileAccess()
    facDest := chilkat.NewFileAccess()

    facSrc.OpenForRead("qa_data/hamlet_compressed.dat")

    // If we compress in 32K chunks, find out how many blocks there will be.
    blockSize := 32768
    numBlocks := facSrc.GetNumBlocks(blockSize)

    // Open an output file for the decompressed data.
    restoredPath := "qa_output/hamlet_restored.xml"
    success = facDest.OpenForWrite(restoredPath)
    if success == false {
        fmt.Println(facDest.LastErrorText())
        compress.DisposeCompression()
        fac.DisposeFileAccess()
        facSrc.DisposeFileAccess()
        facDest.DisposeFileAccess()
        return
    }

    var decompressedStr *string = new(string)
    var compressedBytes []byte

    // Assuming numBlocks > 1
    compress.SetFirstChunk(true)
    compress.SetLastChunk(false)

    i := 0
    for i < numBlocks {
        compressedBytes = facSrc.ReadBlock(i,blockSize)
        decompressedStr = compress.DecompressString(compressedBytes)

        facDest.AppendText(*decompressedStr,"utf-8")

        i = i + 1

        compress.SetFirstChunk(false)
        if i == (numBlocks - 1) {
            compress.SetLastChunk(true)
        }

    }

    facSrc.FileClose()
    facDest.FileClose()

    // Examine the size of the restored file.
    fmt.Println("restored size: ", fac.FileSize(restoredPath))

    // Compare the contents of the original with the restored.
    bEqualContents := fac.FileContentsEqual(restoredPath,originalPath)
    fmt.Println("Contents Equal: ", bEqualContents)

    compress.DisposeCompression()
    fac.DisposeFileAccess()
    facSrc.DisposeFileAccess()
    facDest.DisposeFileAccess()