C# 7za.exe进程状态
本文关键字:进程状态 exe 7za | 更新日期: 2023-09-27 18:33:57
我正在运行一个 7za.exe 进程来 7zip 这样的文件:
ProcessStartInfo proc = new ProcessStartInfo();
proc.FileName = zip_Path;
proc.Arguments = "a -t7z ziped.7z file.bak";
proc.RedirectStandardInput = true;
proc.RedirectStandardOutput = true;
proc.UseShellExecute = false;
proc.CreateNoWindow = true;
p = Process.Start(proc);
while (!p.HasExited)
{
res = p.StandardOutput.ReadLine();
texto += "'n" + res;
}
MessageBox.Show(texto + "'n" + "ErrorCode:" + p.ExitCode);
p.Close();
这工作正常,但是当我在控制台上手动运行7za.exe
时,我可以看到压缩进度。有没有办法在我的应用程序上实时输出它?
我知道
这是一个老问题,但我在这里找到了答案 https://stackoverflow.com/a/4291965/4050735
答案中的代码示例:
var proc = new Process {
StartInfo = new ProcessStartInfo {
FileName = "program.exe",
Arguments = "command line arguments to your executable",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
}
proc.Start();
while (!proc.StandardOutput.EndOfStream) {
string line = proc.StandardOutput.ReadLine();
// do something with line
}
我发现这返回了您通常在控制台中看到的每一行,例如一次压缩一个的每个文件。
Hej,我今天遇到了同样的问题。所以在这里,所有寻找答案并点击这个网站的人(我想当你在 2014 年发布这个问题时,你将不再使用这些信息)这是我解决这个问题的方法:
其核心是 7-Zip 使用不同的流写入输出,而 C# 只获取其中一个。但是您可以使用命令行参数强制 7-Zip 仅使用一个流
-bsp1 -bse1 -bso1
除了你需要的其他东西。然后只需像这样捕获百分比部分:
private static void CreateZip(string path, string zipFilename, Action<int> onProgress) {
Regex REX_SevenZipStatus = new Regex(@"(?<p>[0-9]+)%");
Process p = new Process();
p.StartInfo.FileName = "7za.exe";
p.StartInfo.Arguments = string.Format("a -y -r -bsp1 -bse1 -bso1 {0} {1}",
zipFilename, path);
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.OutputDataReceived += (sender, e) => {
if (onProgress != null) {
Match m = REX_SevenZipStatus.Match(e.Data ?? "");
if (m != null && m.Success) {
int procent = int.Parse(m.Groups["p"].Value);
onProgress(procent);
}
}
};
p.Start();
p.BeginOutputReadLine();
p.WaitForExit();
}
此方法将文件夹压缩为 7-Zip 文件。您可以使用 onProgress 参数(在另一个线程中调用)来处理状态 - 它将包含状态的百分比。
而不是:
proc.CreateNoWindow = true;
尝试:
proc.WindowStyle = ProcessWindowStyle.Hidden;
根据它与控制台的交互方式,ReadLine()
可能还不够,因为它只会在输出换行符时才返回。
7za.exe可能正在操纵当前行以显示进度,在这种情况下,您应该能够使用Read()
。
如果你想更好地了解压缩的情况,你可以使用LZMA C# SDK - 查看SevenZipSharp。