C
C
Set Entry Filepath (in output Zip) when Zipping
Demonstrates how to set the path for the file entry within the .zip to something different than the path in the filesystem.Chilkat C Downloads
#include <C_CkZip.h>
#include <C_CkZipEntry.h>
void ChilkatSample(void)
{
BOOL success;
HCkZip zip;
BOOL saveExtraPath;
HCkZipEntry entry;
int numEntries;
int i;
success = FALSE;
// This requires the Chilkat Zip API to have been previously unlocked.
// See Unlock Chilkat Zip for sample code.
zip = CkZip_Create();
success = CkZip_NewZip(zip,"qa_output/zipA.zip");
// When an absolute filepath is passed to AddFile, the path within the .zip
// will be one of two values: (1) just the filename part if saveExtraPath is FALSE,
// or (2) the full absolute path, but made relative, if saveExtraPath is TRUE.
// (For example, "c:/ck2000/appData/UnitTest/qa_data/hamlet.xml" made relative is
// "ck2000/appData/UnitTest/qa_data/hamlet.xml")
saveExtraPath = FALSE;
success = CkZip_AddFile(zip,"c:/ck2000/appData/UnitTest/qa_data/hamlet.xml",saveExtraPath);
if (success == FALSE) {
printf("%s\n",CkZip_lastErrorText(zip));
CkZip_Dispose(zip);
return;
}
// When a relative path is passed to AddFile, then saveExtraPath does not apply.
// For example, assume our current working directory is "c:/ck2000/appData/UnitTest". The following
// call to AddFile creates an entry with the filepath "qa_data/hamlet.xml".
success = CkZip_AddFile(zip,"qa_data/hamlet.xml",saveExtraPath);
if (success == FALSE) {
printf("%s\n",CkZip_lastErrorText(zip));
CkZip_Dispose(zip);
return;
}
// Examine the entries
entry = CkZipEntry_Create();
numEntries = CkZip_getNumEntries(zip);
i = 0;
while (i < numEntries) {
CkZip_EntryAt(zip,i,entry);
printf("%d: %s\n",i,CkZipEntry_fileName(entry));
i = i + 1;
}
// The output so far is:
// 0: hamlet.xml
// 1: qa_data/hamlet.xml
// If we write the .zip as-is, then the zip will have two entries
// with the filepaths as shown above.
// This writes "qa_output/zipA.zip"
success = CkZip_WriteZip(zip);
// Now change the entry filepaths to whatever is desired.
success = CkZip_EntryOf(zip,"hamlet.xml",entry);
if (success == FALSE) {
printf("entry not found\n");
CkZip_Dispose(zip);
CkZipEntry_Dispose(entry);
return;
}
CkZipEntry_putFileName(entry,"Shakespeare/Claudius1.xml");
success = CkZip_EntryOf(zip,"qa_data/hamlet.xml",entry);
if (success == FALSE) {
printf("entry not found\n");
CkZip_Dispose(zip);
CkZipEntry_Dispose(entry);
return;
}
CkZipEntry_putFileName(entry,"Shakespeare/Claudius2.xml");
// Change the name of the .zip to be written and write again:
CkZip_putFileName(zip,"qa_output/zipB.zip");
success = CkZip_WriteZipAndClose(zip);
if (success != TRUE) {
printf("%s\n",CkZip_lastErrorText(zip));
}
else {
printf("Zip created!\n");
}
// Examine both zipA.zip and zipB.zip using 7zip (or another tool) to see the differences.
CkZip_Dispose(zip);
CkZipEntry_Dispose(entry);
}