WaitForExit实际上是在等待外部程序完成吗

本文关键字:程序 外部 实际上 在等待 WaitForExit | 更新日期: 2023-09-27 18:24:14

我正在编写一个应用程序,其中有两个对外部程序的调用,RichCopy和7zip。这个想法是使用RichCopy来移动文件,并在RichCopy完成后使用7zip来归档和加密文件。我遇到的问题是,尽管我使用的是WaitForExit,但在7zip尝试归档文件之前,应用程序并没有等待RichCopy完成文件移动。代码如下:

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()方法应该等到进程结束后再转到下一行代码?

WaitForExit实际上是在等待外部程序完成吗

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

我的猜测是,您启动的第一个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. 返回Process,而不是void file_copy()。您返回的进程为f1
  2. 在encrypt_data中,添加一个Process参数,并将其设置为从file_copy返回的进程
  3. 然后,在encryptdata中,等待进程结束后再启动zip进程

我认为发生的情况是,由于某种原因,file_copy中的WaitForExit是非阻塞的。要么它被优化了,因为后面什么都没有,要么它确实在等待,但调用函数的下一行无论如何都会启动。

另一种可能性是,file_copy启动RichCopy时使用了格式错误的参数,这会导致它提前退出(可能是因为它什么都不做,也可能是因为返回错误)。试着单独运行file_copy,看看它是否正常工作,是否达到了预期效果。

对于将来遇到这个问题的人来说,我最终做的是围绕一个检查循环一段时间,看看进程"RichCopy64"是否仍在运行。如果它还在运行,我告诉它等10秒,然后再试一次。

感谢所有回应的人——当我得到足够的代表时,我一定会给你的答案投赞成票。