94 lines
3.6 KiB
C#
94 lines
3.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using LCU.API.Collections.RepoApi.Configuration;
|
|
using Serilog;
|
|
using WinSCP;
|
|
using SessionOptions = WinSCP.SessionOptions;
|
|
using TransferMode = WinSCP.TransferMode;
|
|
|
|
namespace LCU.API.Collections.RepoApi.Services.AutoIms
|
|
{
|
|
public class AuctionFtpClientService : IAuctionFtpClientService
|
|
{
|
|
private readonly SessionOptions _sessionOptions;
|
|
private readonly RepoApiConfiguration _configuration;
|
|
|
|
public AuctionFtpClientService(RepoApiConfiguration configuration)
|
|
{
|
|
_configuration = configuration;
|
|
_sessionOptions = new SessionOptions()
|
|
{
|
|
Protocol = Protocol.Sftp,
|
|
HostName = configuration.FtpConfiguration.HostName,
|
|
UserName = configuration.FtpConfiguration.UserName,
|
|
PortNumber = configuration.FtpConfiguration.Port,
|
|
SshHostKeyFingerprint = configuration.FtpConfiguration.SshHostKeyFingerprint,
|
|
SshPrivateKeyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
|
|
configuration.FtpConfiguration.SshPrivateKeyPath)
|
|
};
|
|
}
|
|
|
|
public Dictionary<FileInfo, string> Download()
|
|
{
|
|
var fileResults = new Dictionary<FileInfo, string>();
|
|
using (Session session = new Session())
|
|
{
|
|
TransferOperationResult transferResult = null;
|
|
try
|
|
{
|
|
session.ExecutablePath = _configuration.FtpConfiguration.ExecutablePath;
|
|
session.Open(_sessionOptions);
|
|
}
|
|
catch (WinSCP.SessionLocalException wsle)
|
|
{
|
|
Log.Error(wsle, "Failed to open FTP session, WINSCP likely missing");
|
|
return fileResults;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log.Error(ex,"Failed to open FTP session");
|
|
return fileResults;
|
|
}
|
|
|
|
TransferOptions transferOptions = new TransferOptions();
|
|
transferOptions.TransferMode = TransferMode.Automatic;
|
|
transferOptions.PreserveTimestamp = true;
|
|
|
|
RemoteDirectoryInfo directory = session.ListDirectory(_configuration.RemoteFilePath);
|
|
|
|
foreach (RemoteFileInfo fileInfo in directory.Files)
|
|
{
|
|
string localFileName = Path.Combine(_configuration.LocalDirectoryPath, fileInfo.Name);
|
|
var remoteFileName = Path.Combine(_configuration.RemoteFilePath, fileInfo.Name);
|
|
|
|
FileInfo thisFileInfo = null;
|
|
|
|
try
|
|
{
|
|
if (!fileInfo.IsDirectory && !File.Exists(localFileName))
|
|
{
|
|
thisFileInfo = new FileInfo(localFileName);
|
|
fileResults.Add(thisFileInfo, "success");
|
|
|
|
transferResult = session.GetFiles(remoteFileName, localFileName, true, transferOptions);
|
|
|
|
// Throw on any error
|
|
transferResult.Check();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log.Error(ex, "Exception while FTP'ing files ");
|
|
if (thisFileInfo != null)
|
|
{
|
|
fileResults[thisFileInfo] = ex.Message;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return fileResults;
|
|
}
|
|
}
|
|
} |