我在我的java程序中使用7-zip将几个文件和文件夹(主要是游戏)压缩成几个7-zip文件。
举个例子:
test1.txt and test1 -> test1.7z
test2.txt and test2 -> test2.7z
压缩是没有问题的,但由于文件夹可能非常大,我想包含2个进度条(因此用户可以检查zip进程的距离)。
目前我有以下代码(到目前为止有效),但我怎样才能获得压缩过程的百分比?当前输出只返回压缩过程的开始和结果。
private void runZipCommand() {
ProcessBuilder pb = null;
ArrayList<Game> game = getGames();
for (Game g : game) {
pb = new ProcessBuilder(makeZipString(g, false));
pb.redirectError();
try {
Process p = pb.start();
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while((line = br.readLine()) !=null){
System.out.println(line);
}
System.out.println("Exited with: " + p.waitFor());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
private String makeZipString(Game g, boolean batch) {
String programzip = "";
String gametitle = "";
String restfiles = "";
programzip = "\"" + sevenPath + "\\7z.exe\" " + ZIPCOMMANDS;
if (batch) {
gametitle = " \"" + g.getName().replaceAll("[_[^\\w\\däüöÄÜÖ\\+\\- ]]", "") + ".7z\" ";
} else {
gametitle = " \"" + backupPath.toString() + "\\" + g.getName().replaceAll("[_[^\\w\\däüöÄÜÖ\\+\\- ]]", "")
+ ".7z\" ";
}
restfiles = "\"" + g.getAppmanifest() + "\" \"" + steamUtil.getInstallDir() + "\\" + g.getDir() + "\"";
String s = programzip + gametitle + restfiles;
return s;
}
有没有办法获得单个过程(压缩测试1.7z)的百分比?
如果您需要更多信息,我会尝试尽快添加。
感谢您的回答。
LevKaz
答案 0 :(得分:1)
我想我现在解决了我的问题。
我的“旧”zip-command有以下命令和开关:
7z.exe a -t7z -m0=LZMA2 -mx9 -mmt=2
在查看7-zip.chm后,我发现,我可以通过开关更改输出流:
-bs
将输出流更改为以下
7z.exe a -t7z -m0=LZMA2 -mx9 -mmt=2 -bso0 -bse2 -bsp1
我可以从BufferedReader中提取进度。
无论如何,感谢所有访问过我的问题的人,特别感谢@DavidS链接另一个问题,这个问题使我找到了正确的观点。
编辑:
在提取* .7z文件时,这也很顺利。使用以下命令:
7z.exe x -bso0 -bse2 -bsp1 archive.7z -aoa -o"c:\OutputPath"