
ZipFiles
Igor Pro 9 will include an UnzipFile operation.
Here is a barebones utility for the reverse process, creating an archive. I haven't tested it much, especially on Windows. This overwrites existing archives.
function zipGUI() // get a list of files to zip variable refnum string fileFilters = "All Files:.*;" Open /D/R/F=fileFilters/MULT=1/M="Select files to zip" refnum if (strlen(S_fileName) == 0) return 0 endif zipFiles(ReplaceString("\r", S_fileName, ";"), "") end // utility function, creates a zip archive // all paths are junked, no subfolders are preserved. // not tested much on windows function zipFiles(string FilePathListStr, string zipPathStr) int verbose = 1 // choose whether to print output from executescripttext string msg = "", cmd = "", zipFileStr = "" int i, numfiles numfiles = ItemsInList(FilePathListStr) for (i=0;i<numfiles;i+=1) GetFileFolderInfo /Q/Z StringFromList(i, FilePathListStr) if (V_Flag || V_isFile==0) printf "Could not find %s\r", StringFromList(i, FilePathListStr) return 0 endif endfor if (strlen(zipPathStr) == 0) zipPathStr = SpecialDirPath("Desktop",0,0,0) zipFileStr = "archive.zip" DoAlert 1, "Zip to Desktop:archive.zip?" if (v_flag == 2) return 0 endif else if (cmpstr(zipFileStr[strlen(zipFileStr)-1], ":") == 0) zipFileStr = "archive.zip" else zipFileStr = ParseFilePath(0, zipPathStr, ":", 1, 0) zipPathStr = ParseFilePath(1, zipPathStr, ":", 1, 0) endif GetFileFolderInfo /Q/Z zipPathStr if (V_Flag || V_isFolder==0) sprintf msg, "Could not find zipPathStr folder\rCreate %s?", zipPathStr DoAlert 1, msg if (v_flag == 2) return 0 endif endif endif // make sure zipPathStr folder exists - necessary for mac NewPath /C/O/Q acw_tmpPath, zipPathStr KillPath /Z acw_tmpPath if (stringmatch(StringByKey("OS", IgorInfo(3))[0,2],"Win")) // Windows string strVersion = StringByKey("OSVERSION", IgorInfo(3)) variable WinVersion = str2num(strVersion) // turns "10.1.2.3" into 10.1 and 6.23.111 into 6.2 (windows 8.0) if (WinVersion<6.3) Print "zipArchive requires Windows 10 or later" return 0 endif zipPathStr = ParseFilePath(5, zipPathStr, "\\", 0, 0) cmd = "powershell.exe Compress-Archive -Force -LiteralPath " string strPath for (i=0;i<numFiles;i+=1) strPath = ParseFilePath(5, StringFromList(i, FilePathListStr), "\\", 0, 0) strPath = replacestring("'", strPath, "''") cmd += SelectString(i>0, "", ", ") + "'" + strPath + "'" endfor strPath = replacestring("'", zipPathStr + zipFileStr, "''") cmd += " -DestinationPath '" + strPath + "'" else // Mac zipPathStr = ParseFilePath(5, zipPathStr, "/", 0, 0) sprintf cmd, "zip -j -r -X \\\"%s%s\\\"", zipPathStr, zipFileStr for (i=0;i<numfiles;i++) cmd += " \\\"" + ParseFilePath(5, StringFromList(i, FilePathListStr), "/", 0,0) + "\\\"" endfor sprintf cmd, "do shell script \"%s\"", cmd endif ExecuteScriptText /B/UNQ/Z cmd if (verbose) Print S_value // output from executescripttext endif return (v_flag == 0) end

Forum

Support

Gallery
Igor Pro 10
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More
Awesome! This gives me an Idea to write something for loading zipped data. Some data files I use even have a compression ratio > 100! I wonder if there is a smart way to unzip a file directly into Igor's memory. I guess the approach would be to unzip into a temporary file, load the file and then delete the temporary file. It's a bit scary to wrangle with files on disk that way.
January 18, 2021 at 07:54 pm - Permalink
Both my hack for Igor 8 and Igor 9's UnzipFile work only with file input, so you'd have to add the temporary file step. There's an XOP that's supposed to work with strings.
You could take a look at the way I deal with unzipping to a temporary file in the Updater project.
January 18, 2021 at 11:39 pm - Permalink
Yeah, I will take a look. I want to release some projects of mine soon, so I wanted to get to the updater anyway to make things compatible.
January 19, 2021 at 02:30 am - Permalink