Часть моих данных экспорта приложений в серии 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);
Это не исправить. Поэтому я сделал это дольше и дольше. Сейчас наступает минутная пауза, и эта проблема все еще происходит.
У меня нет идей о том, что может быть причиной этого. У кого-нибудь есть другие мысли?
Ваш блок catch catch не будет ловить исключения, которые возникают во внешней утилите, поэтому после запуска утилиты она вернется в вашу программу.Ваша программа не будет ждать завершения операции zip до ее продолжения. Может ли быть какой-нибудь исполняемый код, которому нужно дождаться завершения процесса zip? –
@ChrisDunaway там * не должен * быть, но поскольку он включает в себя обширный дисковый ввод-вывод, я не могу гарантировать, что код не работает впереди себя, если вы понимаете, что я имею в виду. Вот почему я поставил ожидание. Процесс zip также создает файл, и он делает это без сбоев, поэтому я сомневаюсь, что это ошибка утилиты. –
Это также похоже, что утилита zip запускается дважды, используя одно и то же имя файла zip. Может ли это вызвать проблему? –