Zip a folder containing multiple files


How to use an external command program to zip up a folder containing multiple files

Source Code
-- follows best practice by using local functions
-- these need to be placed before the main() module
-- therefore main() is at the end of the code

local function zip(folder)
  --Opens folder and reads in all files and adds to zip
   local fld = io.popen([[ls ]]..folder..[[/]])
   local allFls = fld:read('*a')
   local fls = allFls:split('\n')

   local script = [[zip ']]..folder..[[']]
   for i=1, #fls do 
      script = script..[[ -xi ']]..folder..[[/]]..fls[i]..[[']]
   io.popen(script..[[ -j]])   

local function createDirectory(folderName)
   io.popen('mkdir -p '..folderName)
 --I added a timer to ensure enough time to create folder before creating the files.
 --Iguana is just too fast sometimes for the Operating system! 
 --Test to figure out if you need to throttle at all with your setup.

--This is just so we have files to work with.
--Your setup will be different for what files you work with.
local function createFiles(Msg, Id)
   local X = xml.parse{data=xml_template}
   X.Patient.Id[1]        = Id
 --WARNING this is just a sample your vmd may be different
   X.Patient.Lastname[1]  = Msg.PID[5][1][1][1]
   X.Patient.Firstname[1] = Msg.PID[5][1][2]
   local f1 ="/"..Id..[[.xml]], 'w')
   local f2 ="/"..Id..[[.txt]], 'w')

xml_template = [[###]]

function main(Msg)
 --Parse incoming message and get Patient id to use for folder and file names
   local Inbound, Name = hl7.parse{vmd='example/demo.vmd',data=Msg}
   local Id = Inbound.PID[3][1][1]:nodeValue()
  --Create a folder for patient in Iguana Folder
  --Create Multiple Files; I create an xml and a txt just to show how to 
  --compress two or more files. You could use os.rename to get an image or other file
   createFiles(Inbound, Id)
 --zip up the folder
How to use an external command program to zip up a folder containing multiple files
Usage Details

This example shows how to zip a folder using Info zip on a Mac. You can use other utilities like winzip, 7-Zip or even Winrar on Windows.

Note: To compress or decompress a single file you can use Iguana’s built in tools for gzip or bzip2 found here.

How to use the code:

  • Paste it into a script or load the attached project zip
  • Load some HL7 messages, you can use the the attached SampleData.txt
    Note: The project already contains the sample data
  • Examine the code and annotations to see how it works
    Note: You will need to change the script generation in the “zip” function to use it on Windows