2014-09-23 102 views
3

我正在编写一个应用程序,其中有两个对外部程序RichCopy和7zip的调用。这个想法是一旦RichCopy完成,就使用RichCopy将文件和7zip归档并加密文件。我遇到的问题是应用程序不会等待RichCopy在7zip尝试归档它们之前完成移动文件,尽管我正在使用WaitForExit。代码如下:WaitForExit实际上是否等待外部程序完成?

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()方法应该等到进程完成之后才转到下一行代码?

+0

根据文档,它应该等待。如果不调用'encrypt_data','file_copy'是否正常工作?你的文件夹名称是否包含空格? – Henrik 2014-09-23 12:19:35

+0

Try f001.FileName =“\”C:\\ Program Files(x86)\\ Microsoft Rich Tools \\ RichCopy 4.0 \\ RichCopy.exe \“”; //编辑为prod – artm 2014-09-23 12:24:13

+0

@Henrik - file_copy工作正常。我想移动的所有文件都正在移动。 – 2014-09-23 13:46:07

回答

0

尝试以下方法:

  1. 代替空隙file_copy(),返回处理。您返回的过程是f1。
  2. 在encrypt_data中,添加一个Process参数并将其设置为您从file_copy返回的进程。
  3. 然后,在encrypt_data中,等待该过程完成后再开始压缩过程。

我认为正在发生的是由于某种原因,file_copy中的WaitForExit是非阻塞的。它可以被优化掉,因为它背后没有任何东西,或者等待,但是调用函数的下一行无论如何都会启动。

另一种可能性是,您的file_copy启动RichCopy格式错误的参数,导致它早退出(无论它什么都不做,或者因为它返回一个错误)。尝试单独运行file_copy以查看它是否正常工作,并执行您期望的操作。

+0

谢谢Nate - 我会试试这些建议。我确实尝试隔离该程序的文件复制部分,并且按预期工作。当我第二次运行该程序时,7zip实际上会看到先前移动的文件从第一次运行并按预期对其进行了归档/加密,但我似乎无法让它等待RichCopy完成。 – 2014-09-23 12:31:36

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();  
    } 
} 
+0

感谢您的回复。我会去挖掘RichCopy,看看那里发生了什么。我辩论使用一个等待命令,但由于要复制的目录是可变的大小,我不认为我可以安全地选择一个时间让程序等待。 – 2014-09-23 12:51:13

0

对于任何人谁碰到这个问题以后,我落得这样做缠绕检查while循环,看看自带如果进程“RichCopy64”仍在运行。如果它仍在运行,我告诉它等待10秒钟,然后再试一次。

感谢所有回复 - 当我获得足够的代表时,我一定会回复您的答案。