2012-05-11 49 views
2

我運行一個7za.exe過程7ZIP像這樣的文件:C#7za.exe進程狀態

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,我可以看到壓縮進程。有什麼方法可以在我的應用程序上實時輸出它嗎?

回答

0

相反的:

proc.CreateNoWindow = true; 

嘗試:

proc.WindowStyle = ProcessWindowStyle.Hidden; 
+0

控制檯正在隱藏,因爲它應該是,但p.StandardOutput.ReadLine();沒有返回壓縮的進度,所以我可以實時顯示7za.exe進程的狀態 – Joaolvcm

0

取決於它如何與控制檯交互ReadLine()可能是不夠的,就好像一個新行字符輸出它只會返回。

7za.exe可能會操縱當前行來顯示進度,在這種情況下您應該可以使用Read()

如果您想更好地瞭解壓縮的情況,您可以使用LZMA C#SDK查看 - 查看SevenZipSharp

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 
} 

我發現,這個返回的每一行,你會在控制檯通常看到諸如每個文件一次壓縮一個。

0

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參數(在另一個線程中調用)來處理狀態 - 它將包含狀態的百分比。

+0

@Bhargav爲什麼刪除答案的那部分?這是否獲得NAA標誌? – Stijn

+1

是的,@Stijn,刪除了最後一部分,因爲剩下的部分是有效的答案。 –