【问题标题】:c# stop process after runningc#运行后停止进程
【发布时间】:2020-01-12 00:26:41
【问题描述】:

我有一个问题,我想用 7za.exe 解压缩一个 zip 文件,然后我想终止该进程。如果我使用如下代码,我会遇到进程在解压缩文件之前被终止的问题。

我已经尝试过使用 HasExited 或 WaitForExit,但没有机会。有人有想法吗?唯一可行的方法是使用 Thread.Sleep(1000) 函数,我不能使用它,因为它会减慢一些其他进程。

System.Diagnostics.ProcessStartInfo zipper = new System.Diagnostics.ProcessStartInfo(@"##archzip.text##");
            zipper.Arguments = string.Format("x " + (PathOfFile) + "  -o" + (NewPathOfFile) + "");
            zipper.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            System.Diagnostics.Process proc = System.Diagnostics.Process.Start(zipper);
            proc.Kill();

提前致谢!

【问题讨论】:

  • 为什么需要杀死进程?解压后不会自行退出吗?
  • 如果您发现自己杀死了一个预期会自行退出的进程,那么您做错了。
  • 为什么不直接使用代码解压缩文件,而不是为此使用外部工具? (有一些相当不错的库可用于 c#,例如 nuget.org/packages/DotNetZip
  • 感谢您的回复。我只能使用系统类,这就是我选择使用7za.exe的原因..

标签: c# process


【解决方案1】:

你可以试试下面的代码

using System.IO.Compression;

public static void Decompress(FileInfo fileToDecompress)
{
    using (FileStream originalFileStream = fileToDecompress.OpenRead())
    {
        string currentFileName = fileToDecompress.FullName;
        string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length);

        using (FileStream decompressedFileStream = File.Create(newFileName))
        {
            using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
            {
                decompressionStream.CopyTo(decompressedFileStream);
                Console.WriteLine("Decompressed: {0}", fileToDecompress.Name);
            }
        }
        }
}

如果要解压文件夹,可以使用下面的命令行:

ZipFile.ExtractToDirectory(@"C:\temp\file\9906759_Testpraefix_14028604.zip", @"C:\temp\file\extract\9906759_Testpraefix_14028604");

【讨论】:

  • 非常感谢你的例子!但不幸的是,它不适用于 DOC600ZIP 文件。解压缩后文件的大小为 0 KB。
  • @dankoe,这个文件的规格是什么?谢谢。
  • 它是一个 ZIP 文件,里面有一个 .doc。我也可以将文件重命名为 .ZIP 但解压缩后的文件会进一步损坏。提前致谢。
  • 我在哪里可以得到这个文件的样本来执行测试?
  • 我已经给你发了一封电子邮件 :) 非常感谢你的帮助!
最近更新 更多