Files
2026-04-20 14:47:24 -05:00

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;
}
}
}