![]() |
Chilkat HOME Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi DLL Go Java JavaScript Node.js Objective-C PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Tcl) Understanding ZIP Entry Types and the ZIP Object LifecycleSee more Zip Examples
This example demonstrates how the The example shows:
The example also demonstrates the meaning of the different
This example is useful for understanding how the
Note: This example requires Chilkat v11.0.0 or greater.
load ./chilkat.dll set success 0 set success 0 set zip [new_CkZip] set zipPath "c:/temp/out.zip" # Start a new Zip object and set the output path. # This does not create the .zip file yet. It only initializes the Zip object # and records the filename to be used later when WriteZip is called. CkZip_NewZip $zip $zipPath # Add references to files in the local filesystem. # AppendFilesEx does not read, compress, or store the file contents at this point. # It only adds file references to the Zip object. The referenced files are # read and compressed later, when WriteZip is called. set recurse 1 set saveExtraPath 0 set archiveOnly 0 set includeHidden 1 set includeSystem 0 set success [CkZip_AppendFilesEx $zip "c:/temp/files_to_zip" $recurse $saveExtraPath $archiveOnly $includeHidden $includeSystem] if {$success == 0} then { puts [CkZip_lastErrorText $zip] delete_CkZip $zip exit } # We can inspect the entries that have been added to the Zip object. # At this stage, the entries are still references to files in the local filesystem. set entry [new_CkZipEntry] set count [CkZip_get_NumEntries $zip] set i 0 while {$i < $count} { CkZip_EntryAt $zip $i $entry puts [CkZipEntry_fileName $entry] entryType = [CkZipEntry_get_EntryType $entry] set i [expr $i + 1] } puts "----" # Sample output for the above loop: # # hamlet.xml entryType = 1 # hello.pdf entryType = 1 # ... # ... # # entryType = 1 means "File Entry". # A File Entry is a reference to a file in the local filesystem. # The file data has not yet been read into the Zip object. # # Possible entryType values: # # 0 - Mapped Entry: # An entry that already exists in an open .zip file. # # 1 - File Entry: # A file in the local filesystem that has been referenced, but not yet # read or compressed. These entries are added by methods such as # AppendFiles, AppendFilesEx, and AddFile. # # 2 - Data Entry: # An entry containing uncompressed data already held in memory. # These entries are added by methods such as AddData, AddString, # AddSb, AddBd, and AddEncoded. # # 3 - Null Entry: # An entry that no longer exists in the .zip. # # 4 - New Directory Entry: # A directory entry added by calling AddEmpty. # Additional entries can still be added before the .zip is written. # This entry is created from an in-memory string, so it is a Data Entry # rather than a File Entry. CkZip_AddString $zip "helloWorld.txt" "Hello World" "utf-8" # Inspect the Zip object again before writing. # The file references are still entryType = 1. # The in-memory string entry is entryType = 2. set count [CkZip_get_NumEntries $zip] set i 0 while {$i < $count} { CkZip_EntryAt $zip $i $entry puts [CkZipEntry_fileName $entry] entryType = [CkZipEntry_get_EntryType $entry] set i [expr $i + 1] } puts "----" # Sample output: # # hamlet.xml entryType = 1 # hello.pdf entryType = 1 # ... # ... # helloWorld.txt entryType = 2 # # helloWorld.txt has entryType = 2 because its contents came from memory. # It is not a reference to a file in the local filesystem. # ---------------------------------------------------------------------------- # Write the Zip object to the .zip file. # # During this call, Chilkat reads the referenced files from the local filesystem, # compresses the data as needed, and writes the final .zip archive. CkZip_put_FileName $zip $zipPath set success [CkZip_WriteZip $zip] if {$success == 0} then { puts [CkZip_lastErrorText $zip] delete_CkZip $zip delete_CkZipEntry $entry exit } # After WriteZip returns successfully, the .zip file is written and remains # open in the Zip object. The entries now correspond to entries in the # currently open .zip archive. set count [CkZip_get_NumEntries $zip] set i 0 while {$i < $count} { CkZip_EntryAt $zip $i $entry puts [CkZipEntry_fileName $entry] entryType = [CkZipEntry_get_EntryType $entry] set i [expr $i + 1] } puts "----" # Sample output: # # hamlet.xml entryType = 0 # hello.pdf entryType = 0 # ... # ... # helloWorld.txt entryType = 0 # # entryType = 0 means "Mapped Entry". # A Mapped Entry is an entry that exists in an open .zip file. # ---------------------------------------------------------------------------- # The .zip remains open after WriteZip, so additional entries can still be added. # # This adds another in-memory string entry to the currently open Zip object. CkZip_AddString $zip "helloWorld2.txt" "Hello World 2" "utf-8" # Write the .zip again to include the newly added entry. set success [CkZip_WriteZip $zip] if {$success == 0} then { puts [CkZip_lastErrorText $zip] delete_CkZip $zip delete_CkZipEntry $entry exit } # Inspect the entries one final time. # After the second WriteZip, the new entry is also mapped to the open .zip file. set count [CkZip_get_NumEntries $zip] set i 0 while {$i < $count} { CkZip_EntryAt $zip $i $entry puts [CkZipEntry_fileName $entry] entryType = [CkZipEntry_get_EntryType $entry] set i [expr $i + 1] } puts "----" # Sample output: # # hamlet.xml entryType = 0 # hello.pdf entryType = 0 # ... # ... # helloWorld.txt entryType = 0 # helloWorld2.txt entryType = 0 # Close the open .zip archive and clear the Zip object. CkZip_CloseZip $zip puts "Success" delete_CkZip $zip delete_CkZipEntry $entry |
||||
© 2000-2026 Chilkat Software, Inc. All Rights Reserved.