ZIPping with Windows Shell
... here in Dyalog APL syntax.
Suddenly I came in need of zipping files. And what more obvious solution than to use the zip-facilities already present in Windows? In essence it can be accomplished in a 3 (+1 if you don't already have a zip file) step process as follows.
If need be first create an empty zip file, basically a file with these 22 byte values: 80 75 5 6 0 ... 0:
tn←zip_file_name ⎕NCREATE 0 (22↑80 75 5 6)⎕NAPPEND tn 83 ⎕NUNTIE tn
Once the zip file is present, create an instance of the Shell COM...
... get a handle to the files, here a folder and the zip archive, calling the NameSpace method...
ADD←SHAPP.NameSpace⊂add_folder_name FILES←ADD.Items ZIP←SHAPP.NameSpace⊂zip_file_name
... and finally have all files in that folder copied to the ZIP archive,
where 4 means "don't display a progress dialog box", and 16 "respond with 'Yes to All' for any dialog box that is displayed".
Note that FILES can be a FolderItems object (as here), a FolderItem object (result from the Item method), or a string that represents a file name.
Please note also that this stuff works only on versions of Windows that actually have the zipping capability, i.e. it won't zip anything on e.g. Windows 2000 but instead overwrite any existing ZIP file.