Это еще одно решение, которое работает для меня, использует встроенные функции и поэтому без переписывания логики FTP вручную:
1) Создайте в вашем пакете переменную с именем FTP_Error
2) Выберите задачу FTP, затем перейдите на вкладку «Обработчики событий»
3) Нажмите на странице, чтобы создать обработчик событий для «Задачи FTP / OnError» - он будет срабатывать при возникновении проблем с FTP
4) На панели инструментов перетащите элемент «Задача сценария» и дважды щелкните его, чтобы открыть его
5) В первом всплывающем окне ReadOnlyVariables - добавить System :: ErrorCode, System :: ErrorDescription
6) В первом всплывающем окне ReadWriteVariables - добавьте переменную User :: FTP_Error
7) Редактировать скрипт
8) В скрипте установите переменную FTP_Error для хранения переменных ReadOnlyVariable, которые у нас были выше:
Dts.Variables["FTP_Error"].Value = "ErrorCode:" + Dts.Variables["ErrorCode"].Value.ToString() + ", ErrorDescription=" + Dts.Variables["ErrorDescription"].Value.ToString();
9) Сохранить и закрыть скрипт
10) Нажмите «ОК» для выполнения сценария
11) Вернуться на вкладку «Поток управления»
12) В задаче FTP OnError перейдите к новой задаче «Сценарий» и отредактируйте ее
13) ReadOnlyVariables: User :: FTP_Error from before
14) Теперь, когда на FTP не найдено файлов, код ошибки -1073573501
(список ссылок кода ошибки можно найти здесь: http://msdn.microsoft.com/en-us/library/ms345164.aspx)
15) В вашем скрипте вставьте логику, чтобы делать то, что вы хотите - если вы найдете код «файлы не найдены», то, возможно, вы скажете, что задача выполнена успешно. Если нет, то задача не выполнена. И ваш нормальный поток может справиться с этим, как вы хотите:
if (Dts.Variables["FTP_Error"].Value.ToString().Contains("-1073573501"))
{
// file not found - not a problem
Dts.TaskResult = (int)ScriptResults.Success;
}
else
{
// some other error - raise alarm!
Dts.TaskResult = (int)ScriptResults.Failure;
}
И оттуда ваш поток Succeeded / Failed будет делать то, что вы хотите с ним делать.