C
C
Compress Large Binary File in Blocks
See more Compression Examples
Compresses a large binary file in blocks.Chilkat C Downloads
#include <C_CkFileAccess.h>
#include <C_CkCompression.h>
#include <C_CkByteData.h>
void ChilkatSample(void)
{
BOOL success;
HCkFileAccess facSrc;
HCkFileAccess facDest;
int blockSize;
int numBlocks;
HCkCompression compress;
HCkByteData fileBytes;
HCkByteData compressedBytes;
int i;
success = FALSE;
// This example assumes the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
facSrc = CkFileAccess_Create();
facDest = CkFileAccess_Create();
// Open a large binary file for reading.
success = CkFileAccess_OpenForRead(facSrc,"qa_data/bmp/big.bmp");
if (success == FALSE) {
printf("%s\n",CkFileAccess_lastErrorText(facSrc));
CkFileAccess_Dispose(facSrc);
CkFileAccess_Dispose(facDest);
return;
}
// If we compress in 64K chunks, find out how many blocks there will be.
blockSize = 65536;
numBlocks = CkFileAccess_GetNumBlocks(facSrc,blockSize);
// Open an output file for the compressed data.
success = CkFileAccess_OpenForWrite(facDest,"c:/temp/qa_output/compressedBmp.dat");
if (success == FALSE) {
printf("%s\n",CkFileAccess_lastErrorText(facDest));
CkFileAccess_Dispose(facSrc);
CkFileAccess_Dispose(facDest);
return;
}
compress = CkCompression_Create();
CkCompression_putAlgorithm(compress,"deflate");
fileBytes = CkByteData_Create();
compressedBytes = CkByteData_Create();
// Assuming numBlocks > 1
CkCompression_putFirstChunk(compress,TRUE);
CkCompression_putLastChunk(compress,FALSE);
i = 0;
while (i < numBlocks) {
success = CkFileAccess_ReadBlock(facSrc,i,blockSize,fileBytes);
success = CkCompression_CompressBytes(compress,fileBytes,compressedBytes);
CkFileAccess_FileWrite(facDest,compressedBytes);
i = i + 1;
CkCompression_putFirstChunk(compress,FALSE);
if (i == (numBlocks - 1)) {
CkCompression_putLastChunk(compress,TRUE);
}
}
CkFileAccess_FileClose(facSrc);
CkFileAccess_FileClose(facDest);
printf("Finished compressing file.\n");
CkFileAccess_Dispose(facSrc);
CkFileAccess_Dispose(facDest);
CkCompression_Dispose(compress);
CkByteData_Dispose(fileBytes);
CkByteData_Dispose(compressedBytes);
}