Я нашел WinSCP как отличное решение для интеграции загрузки SFTP с существующим процессом. Однако мне не удалось найти типы ошибок, которые могут быть вызваны оболочкой .NET.
Мне нравится иметь детальную обработку ошибок там, где я могу, но, не зная, какие ошибки может выдать DLL, мне нужно использовать более широкий перехват ошибок. Я запускаю передачу в фоновом рабочем потоке, и пользовательский интерфейс позволяет пользователям добавлять файлы в очередь обработки во время работы приложения. Приведенный ниже код упрощает процесс получения исходного и конечного путей.
lstFTM
– список, содержащий файлы для перемещения.lstRes
– запись каждой попытки получить
private void DoTransfer()
{
// Set up session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = "ftp.somesite.com",
UserName = "user",
Password = "pass",
SshHostKeyFingerprint = "ssh-rsa 2048 ABC123xxx and so on",
};
using (Session session = new Session())
{
// Connect
try
{
session.Open(sessionOptions);
// Transfer files
const string remotePath = @"\\NAS\path\*";
foreach (string _s in lstFTM.Items)
{
try
{
session.GetFiles(_s, remotePath).Check();
lstRes.Items.Add(string.Format("{0} downloaded on {1}", _s, DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")));
}
catch (Exception iex)
{
lstRes.Items.Add(string.Format("file transfer failed for {0} - reported error {1}", _s, iex.Message));
}
}
}
catch (Exception ex)
{
lstRes.Items.Add("session did not open (" + ex.Message + ")");
}
}
}
Это работает хорошо, но, очевидно, я бы предпочел более осторожно обрабатывать различные типы исключений (файловый ввод-вывод, источник не найден, разрешения и т. д.)