WaitForExit实际上是否等待外部程序完成?

时间:2014-09-23 12:11:25

标签: c#

我正在编写一个应用程序,其中有两个外部程序调用,RichCopy和7zip。我们的想法是使用RichCopy移动文件和7zip,以便在RichCopy完成后存档并加密文件。我遇到的问题是,即使我使用WaitForExit,应用程序也不会等待RichCopy在7zip尝试归档之前完成文件的移动。代码如下:

file_copy(groupNumberINT, groupNumber, extFolderPath, scanFolderPath);
encrypt_data(groupNumber, outputFolder);

    private void file_copy(int groupNumberINT, string groupNumber, string externalFolder, string scansFolder)
    {
        if (groupNumberINT < 370)
        {
            string sourceFolder = "D:\\Test\\Production\\CMSFILE001-Copy\\" + groupNumber;

            ProcessStartInfo f001 = new ProcessStartInfo();
            f001.FileName = "C:\\Program Files (x86)\\Microsoft Rich Tools\\RichCopy 4.0\\RichCopy.exe"; //Edit in prod
            f001.Arguments = sourceFolder + " " + externalFolder;
            f001.WindowStyle = ProcessWindowStyle.Normal;

            Process f1 = Process.Start(f001);
            f1.WaitForExit();
        }
    }

    private void encrypt_data(string groupNumber, string outputDirectory)
    {
        // Create 7zip encrypted archive
        string archiveName = groupNumber + @".7z";
        string archiveFolder = @"D:\Test\" + groupNumber;
        string outputFile = tbGroupNumber.Text + ".7z";

        ProcessStartInfo p = new ProcessStartInfo();
        p.FileName = "C:\\Program Files\\7-Zip\\7za.exe";
        p.Arguments = "a -mx -mhe -pPassword fileout.7z folder";
        p.WindowStyle = ProcessWindowStyle.Maximized;

        Process x = Process.Start(p);
        x.WaitForExit();
    }

所以RichCopy启动,但在我看到RichCopy 7zip的启动画面开始存档和加密空文件夹后立即启动。是否有我遗漏的东西,或者WaitForExit()方法是否应该等到流程完成后才转到下一行代码?

3 个答案:

答案 0 :(得分:1)

等待退出确实等待外部进程完成。

我的猜测是,您启动的第一个richcopy可执行文件可能会启动另一个进程,然后进行真正的复制工作。

等待退出的工作示例:

using System.Diagnostics;

public class MainApp
{

    public static void Main(string[] args)
    {    
        string textFile = @"c:\workspace\1.txt";
        openNotepad(textFile);
        openNotepad(textFile);    
    }

    private static void openNotepad(string textfile)
    {         
         ProcessStartInfo f001 = new ProcessStartInfo();
         f001.FileName = "notepad.exe";
         f001.Arguments = textfile;
         f001.WindowStyle = ProcessWindowStyle.Normal;
         Process f1 = Process.Start(f001);
         f1.WaitForExit();    
     }  
}

答案 1 :(得分:0)

尝试以下方法:

  1. 而不是void file_copy(),返回Process。您返回的过程是f1。
  2. 在encrypt_data中,添加一个Process参数并将其设置为从file_copy返回的进程。
  3. 然后,在encrypt_data中,等待进程完成,然后再启动zip进程。
  4. 我认为发生的事情是file_copy中的WaitForExit由于某种原因是非阻塞的。要么它已经被优化了,因为它背后没有任何东西,或它确实等待,但是无论如何都要启动调用函数的下一行。

    另一种可能性是你的file_copy使用格式错误的参数启动RichCopy,这会导致它提前退出(因为它没有做任何事情,或者因为它返回错误)。尝试单独运行file_copy以查看它是否正常工作并执行您期望的操作。

答案 2 :(得分:0)

对于将来遇到这个问题的任何人,我最终做的是围绕支票包裹一个while循环,以查看过程&#34; RichCopy64&#34;还在运行如果它还在运行,我告诉它等待10秒钟,然后再试一次。

感谢所有回复的人 - 当我得到足够的代表时,我一定会提出你的答案。