Sample code for 30+ languages & platforms
PHP ActiveX

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 PHP ActiveX Downloads

PHP ActiveX
<?php

$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 = new COM("Chilkat.Compression");
$compress->Algorithm = 'deflate';

$success = $compress->CompressFile('qa_data/hamlet.xml','qa_data/hamlet_compressed.dat');
if ($success == 0) {
    print $compress->LastErrorText . "\n";
    exit;
}

$fac = new COM("Chilkat.FileAccess");

// 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) . "\n";
print 'compressed size: ' . $fac->FileSize('qa_data/hamlet_compressed.dat') . "\n";

// Decompress in blocks..
$facSrc = new COM("Chilkat.FileAccess");
$facDest = new COM("Chilkat.FileAccess");

$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 . "\n";
    exit;
}

// Assuming numBlocks > 1
$compress->FirstChunk = 1;
$compress->LastChunk = 0;

$i = 0;
while ($i < $numBlocks) {
    $compressedBytes = $facSrc->ReadBlock($i,$blockSize);
    $decompressedStr = $compress->decompressString($compressedBytes);

    $facDest->AppendText($decompressedStr,'utf-8');

    $i = $i + 1;

    $compress->FirstChunk = 0;
    if ($i == ($numBlocks - 1)) {
        $compress->LastChunk = 1;
    }

}

$facSrc->FileClose();
$facDest->FileClose();

// Examine the size of the restored file.
print 'restored size: ' . $fac->FileSize($restoredPath) . "\n";

// Compare the contents of the original with the restored.
$bEqualContents = $fac->FileContentsEqual($restoredPath,$originalPath);
print 'Contents Equal: ' . $bEqualContents . "\n";

?>