MTA:Eir/FileSystem/createZIPArchive
From Multi Theft Auto: Wiki
This function creates a .zip archive inside of the given MTA:Eir file/stream class and returns its translator handle. The archive will not be written into the stream unless the save method of the archive translator is called.
Syntax
atranslator fsnamespace.createZIPArchive ( file fileHandle )
Arguments
- fileHandle: a MTA:Eir FileSystem file/stream class that is writable.
 
Returns
This function returns the FileSystem translator that grants access to contents of an archive if fileHandle is a valid file pointer to create a .zip archive in, false otherwise.
Remarks
This function is currently unavailable in the fileSystem.dll module.
Example
Click to collapse [-]
ServerThis snippet packs all server resources into .zip archives and puts them into an output directory, which can be a shared release directory. This sample should be expanded to support resource sub-directories. It is highly conceptual for now.
-- Create our FileSystem interface.
local fsys = createFilesystemInterface();
if not ( fsys ) then
    outputDebugString( "cannot create FileSystem interface" );
    return false;
end
-- Gain access to the resource root.
local resourcesRoot = fsys.createTranslator( fsys.root.absPath() .. "mods/deathmatch/resources/" );
if not ( resourcesRoot ) then
    outputDebugString( "cannot link server resources directory" );
    return false;
end
-- Create an output release directory next to the actual resources directory.
fsys.root.createDir( "mods/deathmatch/release_resources/" );
-- Attempt to link it.
local releaseRoot = fsys.createTranslator( fsys.root.absPath() .. "mods/deathmatch/release_resources/" );
if not ( releaseRoot ) then
    outputDebugString( "cannot link release directory" );
    return false;
end
-- Archive the resources.
local function dirIterator( dirPath )
    -- Get the simple name of the resource.
    -- It should be the name of the .zip archive
    local relPath = resourcesRoot.relPath( dirPath );
    local simpleName = string.sub( relPath, 1, #relPath - 1 );
    -- Get the resource instance directory link.
    local resRoot = fsys.createTranslator( dirPath );
    if not ( resRoot ) then
        outputDebugString( "resource " .. simpleName .. " could not be linked" );
        return;
    end
    -- todo: validate the resource.
    -- Create our resource .zip
    local zipFile = releaseRoot.open( simpleName .. ".zip", "wb+" );
    if ( zipFile ) then
        local zipTranslator = fsys.createZIPArchive( zipFile );
        if ( zipTranslator ) then
            -- Copy all files into it.
            local function copyIterator( filePath )
                -- todo: optimize this operation.
                -- can be done by splitting up into multiple write operations.
                local copyFile = resRoot.open( filePath, "rb" );
                if ( copyFile ) then
                    local outFile = zipTranslator.open( resRoot.relPath( filePath ), "wb" );
                    if ( outFile ) then
                        zipTranslator.write( copyFile.read( copyFile.size() ) );
                        outFile.destroy();
                    end
                    copyFile.destroy();
                end
            end
            resRoot.scanDirEx( "/", "*", nil, copyIterator, true );
            -- Write the .zip archive and close the link.
            zipTranslator.save();
            zipTranslator.destroy();
        end
        -- We can close the file now.
        zipFile.destroy();
    end
    -- Clean up.
    resRoot.destroy();
end
resourcesRoot.scanDirEx( "/", "*", dirIterator, nil, false );
-- Clean up after ourselves.
resourcesRoot.destroy();
releaseRoot.destroy();
FileSystem Namespace Functions
FileSystem Translator Functions
- open
 - exists
 - createDir
 - chdir
 - delete
 - copy
 - rename
 - size
 - stat
 - relPath
 - relPathRoot
 - absPath
 - absPathRoot
 - scanDir
 - scanDirEx
 - getDirs
 - getFiles