如何在C#中精简7-Zip压缩时的输出/日志内容?
解决7-Zip输出过滤,仅保留压缩进度行
当然可以实现!你需要通过重定向7-Zip的标准输出,并在代码中过滤出符合你需求的进度行。下面是修改后的完整代码和关键说明:
修改后的C#代码
using System.Diagnostics; using System.Text.RegularExpressions; using System.IO; // 你的原有逻辑部分 ProcessStartInfo p = new ProcessStartInfo(); p.FileName = @"C:\Program Files\7-Zip\7z.exe"; // 添加-bsp1参数让7-Zip仅输出简洁进度(核心优化) p.Arguments = $"a -t7z \"{targetName}\" \"{item.ToString()}\" -mx=9 -bsp1"; p.WindowStyle = ProcessWindowStyle.Minimized; // 开启输出重定向的必要配置 p.RedirectStandardOutput = true; p.UseShellExecute = false; p.CreateNoWindow = true; // 可选:完全隐藏7-Zip运行窗口 Process x = new Process(); x.StartInfo = p; // 注册输出接收事件,过滤进度行 x.OutputDataReceived += (sender, e) => { if (!string.IsNullOrEmpty(e.Data)) { // 匹配类似 "60% U Folder\thisisatext.txt" 的进度行 if (Regex.IsMatch(e.Data, @"^\d+% U .+$")) { Console.WriteLine(e.Data); // 替换为你需要的处理逻辑,比如写入日志或更新UI } } }; x.Start(); x.BeginOutputReadLine(); // 启动异步读取输出 x.WaitForExit(); // 安全判断:仅压缩成功时删除源文件夹 if (x.ExitCode == 0) { Directory.Delete(Path.Combine(dirPath, item.Name), true); } else { Console.WriteLine("压缩失败,已取消文件夹删除操作"); }
关键说明
- 7-Zip参数优化:添加
-bsp1是最关键的一步,这是7-Zip官方提供的简洁进度输出参数,它会直接让7-Zip只输出你需要的进度行,从源头减少冗余信息。 - 输出重定向配置:
RedirectStandardOutput = true和UseShellExecute = false是捕获进程输出的必要条件,CreateNoWindow = true可以彻底隐藏7-Zip的运行窗口(按需选择)。 - 进度行过滤:用正则表达式
@"^\d+% U .+$"精准匹配进度行,若7-Zip的进度格式有细微变化,可随时调整正则规则适配。 - 安全删除逻辑:增加了
ExitCode == 0的判断,只有当7-Zip压缩成功(退出码为0)时才删除源文件夹,避免压缩失败后误删文件。
内容的提问来源于stack exchange,提问作者MTn
相关产品推荐
相关产品推荐

