2015-05-08 3 views
1

Часть моих данных экспорта приложений в серии CSV файлов, добавляет сопроводительную записку, а затем упаковывает все эти данные в защищенный паролем почтовый файл, готовый к отправке.Автоматизированный процесс застежка-молния иногда пропускает файлы

Вот соответствующий код, который делает зажим.

private bool ZipFiles(string zipfile, string filename, string password) 
{ 
    string arguments = string.Format(@"a -tzip ""{0}"" ""{1}"" -p{2}", zipfile, filename, password); 

    ProcessStartInfo startInfo = new ProcessStartInfo(_zipExePath) 
    { 
     UseShellExecute = false, 
     RedirectStandardError = true, 
     RedirectStandardInput = true, 
     RedirectStandardOutput = true, 
     CreateNoWindow = true, 
     ErrorDialog = false, 
     Arguments = arguments, 
     WindowStyle = ProcessWindowStyle.Hidden 
    }; 

    try 
    { 
     Process.Start(startInfo); 
    } 
    catch (Exception ex) 
    { 
     Log.Error("Zip Process Failed", ex); 
     return false; 
    } 

    return true; 
} 

Это называется так:

string notePath = CreateNote(task); 
string zipfile = _outputPath + "\\" task.TaskNumber + ".zip"; 
string filewildcard = _outputPath + "\\Data\\*.csv"; 

if (!ZipFiles(zipfile, filewildcard, task.Password) || !ZipFiles(zipfile, notePath, task.Password)) 
{ 
    Log.Error("Failed to created zip archive for Id " + task.TaskID); 
    hasError = true; 
} 

Большую часть времени, это работает без проблем. Однако есть проблема с прерывистой ситуацией, которая приводит к тому, что некоторые целевые файлы не попадают в архив. В большинстве случаев, когда это происходит, заметка включается, но ни одна из данных. Редко, файлы вообще не включены в архив.

В задачах, которые не срабатывают, не существует объединяющего фактора. Иногда задача не сможет создать правильный почтовый индекс, а затем, после сброса, его можно запустить снова и правильно создать почтовый индекс.

Всякий раз, когда я пытался использовать отладчик для пошагового этот код, чтобы воспроизвести проблему, файлы почтовый индекс, как и ожидалось. Я делал это много раз, и в отладчике он работает без сбоев каждый раз.

Ошибка при регистрации не выполняется, если файлы не все.

Поэтому я предположил, что это может быть вопрос времени - который эффективно код получал в почтовых части до того, как диск был закончен выводом данных. Я добавил выжидательную между кодом, который генерирует данные, и код, который я отправил

Thread.Sleep(500); 

Это не исправить. Поэтому я сделал это дольше и дольше. Сейчас наступает минутная пауза, и эта проблема все еще происходит.

У меня нет идей о том, что может быть причиной этого. У кого-нибудь есть другие мысли?

+0

Ваш блок catch catch не будет ловить исключения, которые возникают во внешней утилите, поэтому после запуска утилиты она вернется в вашу программу.Ваша программа не будет ждать завершения операции zip до ее продолжения. Может ли быть какой-нибудь исполняемый код, которому нужно дождаться завершения процесса zip? –

+0

@ChrisDunaway там * не должен * быть, но поскольку он включает в себя обширный дисковый ввод-вывод, я не могу гарантировать, что код не работает впереди себя, если вы понимаете, что я имею в виду. Вот почему я поставил ожидание. Процесс zip также создает файл, и он делает это без сбоев, поэтому я сомневаюсь, что это ошибка утилиты. –

+1

Это также похоже, что утилита zip запускается дважды, используя одно и то же имя файла zip. Может ли это вызвать проблему? –

ответ

2

Я думаю, что проблема может быть вызвана этим кодом:

if (!ZipFiles(zipfile, filewildcard, task.Password) || !ZipFiles(zipfile, notePath, task.Password)) 
{ 
    Log.Error("Failed to created zip archive for Id " + task.TaskID); 
    hasError = true; 
} 

Когда if выполняется оператор, то первое вызывает ZipFiles который будет возвращать почти сразу с истинного результата, он будет называть ZipFiles снова (второе условие оператора if), так что у вас есть два экземпляра утилиты zip, запущенных почти в одно и то же время, используя одно и то же имя файла zip. Они могут наступать на пальцы друг друга.

Вы можете попробовать добавить вызов Process.WaitForExit, чтобы убедиться, что первый экземпляр завершается перед началом второго:

try 
{ 
    Process p = Process.Start(startInfo); 
    p.WaitForExit(); 
} 
catch (Exception ex) 
{ 
    Log.Error("Zip Process Failed", ex); 
    return false; 
} 

try/catch в этом коде не будет отлавливать все исключения, которые происходят в утилите почтового индекса. Он будет улавливать любые исключения, которые возникают, когда , начиная исполняемый файл. Вы можете проверить значение p.ExitCode, чтобы узнать, есть ли у программы какие-либо проблемы, и если да, верните false.

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