3

我正在运行一个 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在控制台上手动运行时,我可以看到压缩进度。有没有办法在我的应用程序上实时输出它?

4

4 回答 4

2

我知道这是一个老问题,但我在这里找到了答案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
}

我发现这会返回您通常在控制台中看到的每一行,例如每次压缩一个文件的每个文件。

于 2015-04-29T10:15:52.923 回答
2

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 参数(在另一个线程中调用)来处理状态 - 它将包含状态的百分比。

于 2017-03-23T10:56:09.627 回答
0

取决于它与控制台的交互方式ReadLine()可能还不够,因为它只会在输出换行符时返回。

7za.exe 可能正在操纵当前行以显示进度,在这种情况下您应该可以使用Read().

如果您想更好地了解压缩发生的情况,您可以使用 LZMA C# SDK 查看 - 查看SevenZipSharp

于 2014-04-01T01:13:54.270 回答
0

代替:

proc.CreateNoWindow = true;

尝试:

proc.WindowStyle = ProcessWindowStyle.Hidden;
于 2012-05-11T13:52:35.597 回答