using System; using Serilog; using WinSCP; using System.Collections.Generic; using System.Linq; using LCU.Api.Internal.FTPLib.Models; using LCU.Api.Internal.FTP.Helpers; namespace LCU.Api.Internal.FTP.Services.FtpOpertionServices; public class WinScpListDirectoryService : IWinScpListDirectoryService { private const char FileTypeFiles = '-'; public List GetListOfFilesInDirectory(ListDirectoryRequest listDirectoryRequest) { try { var remoteDirectoryInfo = GetRemoteDirectoryInfo(listDirectoryRequest); var fileNamesInDirectory = remoteDirectoryInfo.Files.Where(file => file.FileType == FileTypeFiles) .Select(file => file.Name) .ToList(); return fileNamesInDirectory; } catch (Exception exception) { Log.Error(exception, $"Failed to get directory list with WinSCP. " + $"Host: {listDirectoryRequest.SessionInformation.HostName}, " + $"RemotePath: {listDirectoryRequest.RemotePath}"); throw; } } public RemoteDirectoryInfo GetRemoteDirectoryInfo(ListDirectoryRequest listDirectoryRequest) { RemoteDirectoryInfo remoteDirectoryInfo = null; try { var sessionOptions = WinScpSessionOptionsHelper.CreateSessionOptions(listDirectoryRequest.SessionInformation); using (var session = new Session()) { session.Open(sessionOptions); var transferOptions = new TransferOptions { TransferMode = TransferMode.Binary, PreserveTimestamp = false }; remoteDirectoryInfo = session.ListDirectory(listDirectoryRequest.RemotePath); ArgumentNullException.ThrowIfNull(remoteDirectoryInfo); } return remoteDirectoryInfo; } catch (Exception exception) { Log.Error(exception, $"Failed to get directory list with WinSCP. " + $"Host: {listDirectoryRequest.SessionInformation.HostName}, " + $"RemotePath: {listDirectoryRequest.RemotePath}"); throw; } } }