如何向已有的Zip文件/文件夹中追加文件?
向已有Zip文件追加文件的MATLAB解决方案
可以向已有Zip文件追加文件,MATLAB自带的zip(zipfilename, filenames)函数确实会直接覆盖原文件,以下是Windows 10环境下的两种可行方案:
方案一:调用Windows PowerShell命令
利用Windows 10自带的PowerShell的Compress-Archive命令,通过-Update参数实现文件追加或更新,示例代码:
zipfilename = 'existing.zip'; files_to_add = {'newfile1.txt', 'subfolder/newfile2.mat'}; % 逐个追加文件到已有Zip for file = files_to_add cmd = sprintf('powershell Compress-Archive -Path "%s" -DestinationPath "%s" -Update', file{1}, zipfilename); [status, result] = system(cmd); if status ~= 0 warning('追加文件%s失败:%s', file{1}, result); end end
注:该命令要求Windows 10 1607及以上版本,若系统版本过低可能无法使用
Compress-Archive。
方案二:调用Java压缩类(跨平台兼容)
MATLAB内置Java环境,可直接使用java.util.zip包实现追加,示例代码:
zipfilename = 'existing.zip'; files_to_add = {'newfile1.txt', 'subfolder/newfile2.mat'}; % 以追加模式打开已有Zip文件 zipFile = java.io.File(zipfilename); fileOut = java.io.FileOutputStream(zipFile, true); zipOut = java.util.zip.ZipOutputStream(fileOut); for file = files_to_add inputFile = java.io.File(file{1}); % 创建Zip条目并写入文件内容 zipEntry = java.util.zip.ZipEntry(inputFile.getName()); zipOut.putNextEntry(zipEntry); fileIn = java.io.FileInputStream(inputFile); buffer = java.io.BufferedInputStream(fileIn); bytes = uint8(buffer.readAllBytes()); zipOut.write(bytes, 0, length(bytes)); % 关闭当前条目与输入流 zipOut.closeEntry(); fileIn.close(); end % 关闭输出流 zipOut.close(); fileOut.close();
注:该方法若遇到Zip内已有同名文件,会添加重复条目;若需替换同名文件,需先读取原有Zip的所有条目,过滤后重新写入。
内容的提问来源于stack exchange,提问作者Argyll
相关产品推荐
相关产品推荐

