Perl Requires Chilkat v11.0.0+
Perl
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 Perl Downloads
use chilkat();
$success = 0;
# 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::CkCompression->new();
$compress->put_Algorithm("deflate");
$success = $compress->CompressFile("qa_data/hamlet.xml","qa_data/hamlet_compressed.dat");
if ($success == 0) {
print $compress->lastErrorText() . "\r\n";
exit;
}
$fac = chilkat::CkFileAccess->new();
# 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.
print "uncompressed size: " . $fac->FileSize($originalPath) . "\r\n";
print "compressed size: " . $fac->FileSize("qa_data/hamlet_compressed.dat") . "\r\n";
# Decompress in blocks..
$facSrc = chilkat::CkFileAccess->new();
$facDest = chilkat::CkFileAccess->new();
$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 == 0) {
print $facDest->lastErrorText() . "\r\n";
exit;
}
$compressedBytes = chilkat::CkByteData->new();
# Assuming numBlocks > 1
$compress->put_FirstChunk(1);
$compress->put_LastChunk(0);
$i = 0;
while ($i < $numBlocks) {
$success = $facSrc->ReadBlock($i,$blockSize,$compressedBytes);
$decompressedStr = $compress->decompressString($compressedBytes);
$facDest->AppendText($decompressedStr,"utf-8");
$i = $i + 1;
$compress->put_FirstChunk(0);
if ($i == ($numBlocks - 1)) {
$compress->put_LastChunk(1);
}
}
$facSrc->FileClose();
$facDest->FileClose();
# Examine the size of the restored file.
print "restored size: " . $fac->FileSize($restoredPath) . "\r\n";
# Compare the contents of the original with the restored.
$bEqualContents = $fac->FileContentsEqual($restoredPath,$originalPath);
print "Contents Equal: " . $bEqualContents . "\r\n";