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

C# WaitForExit实际上是在等待外部程序完成吗?,c#,C#,我正在编写一个应用程序,其中有两个对外部程序的调用,RichCopy和7zip。其想法是使用RichCopy移动文件,并在RichCopy完成后使用7zip对文件进行归档和加密。我遇到的问题是,尽管我使用的是WaitForExit,但应用程序在7zip尝试归档文件之前并没有等待RichCopy完成移动文件。代码如下: file_copy(groupNumberINT, groupNumber, extFolderPath, scanFolderPath); encrypt_data(groupN

我正在编写一个应用程序,其中有两个对外部程序的调用,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();
    }
文件拷贝(groupnumberprint、groupNumber、extFolderPath、scanFolderPath);
加密_数据(组号、输出文件夹);
私有无效文件\u副本(int-groupnumberprint、string-groupNumber、string-externalFolder、string-scansFolder)
{
如果(GroupNumberPrint<370)
{
string sourceFolder=“D:\\Test\\Production\\CMSFILE001 Copy\\”+groupNumber;
ProcessStartInfo f001=新的ProcessStartInfo();
f001.FileName=“C:\\Program Files(x86)\\Microsoft Rich Tools\\RichCopy 4.0\\RichCopy.exe”;//在产品中编辑
f001.Arguments=sourceFolder+“”+externalFolder;
f001.WindowsStyle=ProcessWindowsStyle.Normal;
进程f1=进程启动(f001);
f1.WaitForExit();
}
}
私有void加密\u数据(字符串组号、字符串输出目录)
{
//创建7zip加密存档
字符串archiveName=groupNumber+@“.7z”;
字符串archiveFolder=@“D:\Test\”+groupNumber;
字符串outputFile=tbGroupNumber.Text+“.7z”;
ProcessStartInfo p=新的ProcessStartInfo();
p、 FileName=“C:\\ProgramFiles\\7-Zip\\7za.exe”;
p、 Arguments=“a-mx-mhe-pPassword fileout.7z文件夹”;
p、 WindowsStyle=ProcessWindowsStyle.Maximized;
进程x=进程启动(p);
x、 WaitForExit();
}
所以RichCopy启动了,但在我看到RichCopy 7zip的启动屏幕后,它立即开始归档和加密一个空文件夹。是否缺少某些内容,或者WaitForExit()方法应该等到进程完成后再继续下一行代码?

请尝试以下操作:

  • 返回进程,而不是作废文件\ u copy()。返回的进程是f1
  • 在加密\u数据中,添加一个进程参数,并将其设置为从文件\u副本返回的进程
  • 然后,在encrypt_data中,等待进程完成后再启动zip进程
  • 我认为正在发生的是,出于某种原因,文件拷贝中的WaitForExit是非阻塞的。要么因为后面没有任何东西而对其进行优化,要么等待,但调用函数的下一行仍然启动


    另一种可能性是,您的file_copy启动RichCopy时参数格式不正确,这会导致它提前退出(要么因为它不做任何事情,要么因为它返回错误)。请尝试单独运行文件拷贝,以查看它是否正常工作并执行预期的操作。

    等待退出会等待外部进程完成

    我的猜测是,您启动的第一个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();    
         }  
    }
    

    对于将来遇到这个问题的任何人来说,我最后做的是围绕一个检查包装一个while循环,以查看进程“RichCopy64”是否仍在运行。如果它仍在运行,我告诉它等待10秒,然后再试一次


    感谢所有回应者——当我得到足够的代表时,我一定会投票支持你的答案。

    根据文档,应该等待。如果您不调用
    加密数据
    ,则
    文件复制
    是否正常工作?文件夹名称是否包含空格?请尝试f001.FileName=“\”C:\\Program Files(x86)\\Microsoft Rich Tools\\RichCopy 4.0\\RichCopy.exe\”//编辑prod@Henrik-文件副本工作正常。我想移动的所有文件都被移动了。@artm-我尝试了你的编辑,但不幸的是我得到了相同的结果。谢谢Nate-我会尝试一下这些建议。我确实尝试隔离程序的文件副本部分,并按预期工作。当我第二次运行该程序时,7zip实际上看到了第一次运行时移动的文件,并按预期对其进行存档/加密,但我似乎无法让它等待RichCopy完成。感谢您的回复。我会深入研究RichCopy,看看那里发生了什么。我曾讨论过使用Wait命令,但由于要复制的目录大小可变,我认为我不能安全地选择程序等待的时间。