【问题标题】:c# 7za.exe process statusc# 7za.exe进程状态
【发布时间】:2012-05-11 13:42:07
【问题描述】:

我正在运行一个 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 时,我可以看到压缩进度。有什么方法可以在我的应用程序上实时输出?

【问题讨论】:

    标签: c# process progress 7zip


    【解决方案1】:

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

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

    【讨论】:

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

      【讨论】:

      • @Bhargav 为什么要删除那部分答案?这是否获得了 NAA 标志?
      • 是的,@Stijn 删除了最后一部分,因为其余部分是有效答案。
      【解决方案3】:

      代替:

      proc.CreateNoWindow = true;
      

      尝试:

      proc.WindowStyle = ProcessWindowStyle.Hidden;
      

      【讨论】:

      • 控制台应该隐藏起来,但是 p.StandardOutput.ReadLine();没有返回压缩进度,所以我可以实时显示 7za.exe 进程的状态
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-27
        • 2013-09-26
        • 2012-06-21
        • 2014-03-02
        • 1970-01-01
        相关资源
        最近更新 更多