Skip to main content
Version: 20 R6 BETA


A 4D ZIP archive is a File or Folder object containing one or more files or folders, which are compressed to be smaller than their original size. These archives are created with a ".zip" extension and can be used to save disk space or transfer files via mediums which may have size limitations (e.g., email or network).


To retrieve and view the contents of a ZIP file object:

var $path; $archive : 4D.File
var $zipFile : 4D.ZipFile
var $zipFolder : 4D.ZipFolder
var $txt : Text

$path:=Folder(fk desktop folder).file("MyDocs/")
$archive:=ZIP Read archive($path)
$zipFolder:=$archive.root // store the zip main folder
$zipFile:=$zipFolder.files()[0] //read the first zipped file

End if


.root : 4D.ZipFolder
a virtual folder providing access to the contents of the ZIP archive

ZIP Create archive

19 R3Added ZIP Compression LZMA, ZIP Compression xy, .level property

ZIP Create archive ( fileToZip : 4D.File ; destinationFile : 4D.File ) : Object
ZIP Create archive ( folderToZip : 4D.Folder ; destinationFile : 4D.File { ; options : Integer }) : Object
ZIP Create archive ( zipStructure : Object ; destinationFile : 4D.File ) : Object

fileToZip4D.File->File or Folder object to compress
folderToZip4D.Folder->File or Folder object to compress
zipStructureObject->File or Folder object to compress
destinationFile4D.File->Destination file for the archive
optionsInteger->folderToZip option: ZIP Without enclosing folder
ResultObject<-Status object


The ZIP Create archive command creates a compressed ZIP archive object and returns the status of the operation.

You can pass a 4D.File, a 4D.Folder, or a zip structure object as first parameter:

  • fileToZip: You simply pass a 4D.File to compress.

  • folderToZip: You pass a 4D.Folder to compress. In this case, the options parameter allows you to compress only the contents of the folder (i.e., exclude the enclosing folder). By default, ZIP Create archive will compress the folder and its contents, so that the decompressing operation will recreate a folder. If you want the decompressing operation to restore only the contents of the folder, pass the ZIP Without enclosing folder constant in the options parameter.

  • zipStructure: You pass an object describing the ZIP archive object. The following properties are available to define the structure:

  • ZIP Compression standard: Deflate compression (default)
  • ZIP Compression LZMA: LZMA compression
  • ZIP Compression XZ: XZ compression
  • ZIP Compression none: No compression
  • levelIntegerCompression level. Possible values: 1 to 10. A lower value will produce a larger file, while a higher value will produce a smaller file. Compression level has however an impact on performance. Default values if omitted:
  • ZIP Compression standard: 6
  • ZIP Compression LZMA: 4
  • ZIP Compression XZ: 4
  • encryptionIntegerThe encryption to use if a password is set:
  • ZIP Encryption AES128: AES encryption using 128-bit key.
  • ZIP Encryption AES192: AES encryption using 192-bit key.
  • ZIP Encryption AES256: AES encryption using 256-bit key (default if password is set).
  • ZIP Encryption none: Data is not encrypted (default if no password is set)
  • passwordTextA password to use if encryption is required.
  • a collection of 4D.File or 4D.Folder objects or
  • a collection of objects with the following properties:
  • PropertyTypeDescription
    source4D.File or 4D.FolderFile or Folder
    destinationText(optional) - Specify a relative filepath to change the organization of the contents of the archive
    optionnumber(optional) - ZIP Ignore invisible files or 0 to compress all of the file
    callback4D.FunctionA callback formula that will receive the compression progress (0 - 100) in $1.

    In the destinationFile parameter, pass a 4D.File object describing the ZIP archive to create (name, location, etc.). It is advised to use the ".zip" extension if you want the ZIP archive to be processed automatically by any software.

    Once an archive is created, you can use the ZIP Read archive command to access it.

    Status object

    The returned status object contains the following properties:

    statusTextTextError message (if any):
  • Cannot open ZIP archive
  • Cannot create ZIP archive
  • Password is required for encryption
  • statusIntegerStatus code
    successBooleanTrue if archive created successfully, else false

    Example 1

    To compress a 4D.File:

     var $file; $destination : 4D.File
    var $status : Object

    $destination:=Folder(fk desktop folder).file("MyDocs/")
    $file:=Folder(fk desktop folder).file("MyDocs/text.txt")

    $status:=ZIP Create archive($file;$destination)

    Example 2

    To compress a 4D.Folder without the folder itself:

     var $folder : 4D.Folder
    var $destination : 4D.File
    var $status : Object

    $destination:=Folder(fk desktop folder).file("MyDocs/")
    $folder:=Folder(fk desktop folder).folder("MyDocs/Images")

    $status:=ZIP Create archive($folder;$destination;ZIP Without enclosing folder)

    Example 3

    To compress a ZIP archive structure with a password and progress bar:

     var $destination : 4D.File
    var $zip;$status : Object
    var progID : Integer

    $destination:=Folder(fk desktop folder).file("MyDocs/")

    $zip:=New object
    $zip.files:=Folder(fk desktop folder).folder("MyDocs/Resources").folders()

    progID:=Progress New //we use the 4D Progress component

    $status:=ZIP Create archive($zip;$destination)

    Progress QUIT(progID)


     var $1 : Integer
    Progress SET PROGRESS(progID;Num($1/100))

    Example 4

    You want to pass a collection of folders and files to compress to the zipStructure object:

     var $destination : 4D.File
    var $zip;$err : Object
    $zip:=New object
    $zip.files:=New collection
    $zip.files.push(New object("source";Folder(fk desktop folder).file("Tests/text.txt")))
    $zip.files.push(New object("source";Folder(fk desktop folder).file("Tests/text2.txt")))
    $zip.files.push(New object("source";Folder(fk desktop folder).file("Images/image.png")))

    $destination:=Folder(fk desktop folder).file("")
    $err:=ZIP Create archive($zip;$destination)

    Example 5

    You want to use an alternative compression algorithm with a high compression level:

    var $destination : 4D.File
    var $zip; $err : Object

    $zip:=New object
    $zip.files:=New collection
    $zip.files.push(Folder(fk desktop folder).folder("images"))
    $zip.compression:=ZIP Compression LZMA
    $zip.level:=7 //default is 4

    $destination:=Folder(fk desktop folder).file("")
    $err:=ZIP Create archive($zip; $destination)

    ZIP Read archive


    ZIP Read archive ( zipFile : 4D.File { ; password : Text }) : 4D.ZipArchive

    zipFile4D.File->Zip archive file
    passwordText->ZIP archive password if any
    Result4D.ZipArchive<-Archive object


    The ZIP Read archive command retrieves the contents of zipFile and returns it as a 4D.ZipArchive object.

    This command does not uncompress the ZIP archive, it only provides a view of its contents. To extract the contents of an archive, you need to use methods such as file.copyTo() or folder.copyTo().

    Pass a 4D.File object referencing the compressed ZIP archive in the zipFile parameter. The target archive file will be opened until the ZIP Read archive has finished executing and all contents/references have been extracted/released, then it will be closed automatically.

    If the zipFile is password protected, you need to use the optional password parameter to provide a password. If a password is required but not passed when trying to read the contents of the archive, an error is generated.

    Archive object

    The returned 4D.ZipArchive object contains a single root property whose value is a 4D.ZipFolder object. This folder describes the whole contents of the ZIP archive.


    To retrieve and view the contents of a ZIP file object:

     var $archive : 4D.ZipArchive
    var $path : 4D.File

    $path:=Folder(fk desktop folder).file("MyDocs/")
    $archive:=ZIP Read archive($path)

    To retrieve the list of the files and folders in the archive:


    To read the contents of a file without extracting it from the root folder:

    End if

    To extract from the root folder:

      //extract a file
    $folderResult:=$files[$i].copyTo(Folder(fk desktop folder).folder("MyDocs"))

    //extract all files
    $folderResult:=$archive.root.copyTo(Folder(fk desktop folder).folder("MyDocs"))


    .root : 4D.ZipFolder


    The .root property contains a virtual folder providing access to the contents of the ZIP archive.

    The root folder and its contents can be manipulated with the ZipFile and ZipFolder functions and properties.

    This property is read-only.