2014-09-23 2 views
3

Я пишу приложение, где есть два вызова внешних программ, RichCopy и 7zip. Идея заключается в использовании RichCopy для перемещения файлов и 7zip для архивирования и шифрования файлов после завершения RichCopy. Проблема, с которой я сталкиваюсь, заключается в том, что приложение не ждет, когда 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

Согласно документам, он должен подождать. Правильно ли работает 'file_copy', если вы не вызываете' encrypt_data'? У ваших имен папок есть пробелы? – Henrik

+0

Попробуйте f001.FileName = "\" C: \\ Program Files (x86) \\ Microsoft Rich Tools \\ RichCopy 4.0 \\ RichCopy.exe \ ""; // Редактировать в prod – artm

+0

@Henrik - file_copy работает правильно. Все файлы, которые я хочу переместить, перемещаются. –

ответ

0

Попробуйте следующее:

  1. вместо пустоты file_copy(), обратный процесс. Возвращаемый процесс - f1.
  2. в encrypt_data, добавьте аргумент Process и установите это для процесса, который вы возвращаете из file_copy.
  3. затем, в encrypt_data, дождитесь завершения процесса, прежде чем вы начнете процесс zip.

Я думаю, что происходит то, что WaitForExit в file_copy по какой-то причине не блокирует. Либо он оптимизирован, потому что за ним ничего нет, или он ждет, но в любом случае запускается следующая строка вызывающей функции.

Другая возможность заключается в том, что файл file_copy запускает RichCopy с неправильными аргументами, из-за чего он рано выходит из строя (либо потому, что он ничего не делает, либо потому, что он возвращает ошибку). Попробуйте запустить file_copy отдельно, чтобы убедиться, что он работает правильно и делает то, что вы ожидаете.

+0

Спасибо Нейт - я попробую эти предложения. Я попытался изолировать часть копии файла программы и работает как ожидалось. Когда я запускаю программу во второй раз, 7zip фактически видит ранее перемещенные файлы из первого запуска и архивирует/шифрует их так же, как ожидалось, но я просто не могу заставить его ждать завершения RichCopy. –

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, чтобы посмотреть, что там происходит.Я обсуждал использование команды Wait, но поскольку скопированные каталоги являются переменными по размеру, я не думаю, что могу спокойно выбрать время ожидания программы. –

0

Для тех, кто попадается этот вопрос в будущем, что я в конечном итоге делает обмотать в то время как петли вокруг проверки, чтобы увидеть, если процесс «RichCopy64» все еще бежал. Если он все еще работает, я сказал ему подождать 10 секунд, затем повторите попытку.

Спасибо всем, кто ответил - когда я получу достаточную репутацию, я обязательно отвечу ваши ответы.

Смежные вопросы