我正在编写一个应用程序,其中有两个外部程序调用,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()方法是否应该等到流程完成后才转到下一行代码?
答案 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)
尝试以下方法:
我认为发生的事情是file_copy中的WaitForExit由于某种原因是非阻塞的。要么它已经被优化了,因为它背后没有任何东西,或它确实等待,但是无论如何都要启动调用函数的下一行。
另一种可能性是你的file_copy使用格式错误的参数启动RichCopy,这会导致它提前退出(因为它没有做任何事情,或者因为它返回错误)。尝试单独运行file_copy以查看它是否正常工作并执行您期望的操作。
答案 2 :(得分:0)
对于将来遇到这个问题的任何人,我最终做的是围绕支票包裹一个while循环,以查看过程&#34; RichCopy64&#34;还在运行如果它还在运行,我告诉它等待10秒钟,然后再试一次。
感谢所有回复的人 - 当我得到足够的代表时,我一定会提出你的答案。