using System; using System.Net; using FluentFTP; namespace JWH.NETWORK { public static class FtpsClient { private static FluentFTP.FtpClient _ftpClient; private static string _host; private static int _port = 990; // FTPS 기본 포트 private static string _userId; private static string _password; public static void Initialize(string host, string userId, string password, int port = 990) { _host = host; _userId = userId; _password = password; _port = port; _ftpClient = new FluentFTP.FtpClient(_host, _port, new NetworkCredential(_userId, _password)) { //EncryptionMode = FtpEncryptionMode.Explicit, EncryptionMode = FtpEncryptionMode.Implicit, SslProtocols = System.Security.Authentication.SslProtocols.Tls12, ConnectTimeout = 500 // 타임아웃 설정 (0.5초) }; _ftpClient.ValidateCertificate += (control, args) => args.Accept = true; // 인증서 검증 비활성화 (운영 확인 필요!) } public static void Connect() { if (_ftpClient == null) { throw new InvalidOperationException("FTPS client is not initialized. Call Initialize() first."); } if (!_ftpClient.IsConnected) { _ftpClient.Connect(); } } public static void Disconnect() { if (_ftpClient != null && _ftpClient.IsConnected) { _ftpClient.Disconnect(); } } public static bool IsFileExists(string path) { Connect(); return _ftpClient.FileExists(path); } public static bool IsDirExists(string path) { Connect(); return _ftpClient.DirectoryExists(path); } public static FtpListItem[] GetFtpsList(string path) { Connect(); return _ftpClient.GetListing(path); } public static object GetObjectInfo(string filePath) { Connect(); return _ftpClient.GetObjectInfo(filePath); } public static FtpListItem GetFileInfo(string remoteFilePath) { try { FtpsClient.Connect(); if (!_ftpClient.IsConnected) { Console.WriteLine("FTPS 서버에 연결되지 않았습니다."); return null; } // Passive Mode 설정 (필요한 경우) // _ftpClient.SetPassiveMode(true); if (!FtpsClient.IsFileExists(remoteFilePath)) { Console.WriteLine("파일이 존재하지 않습니다."); return null; } var fileInfo = FtpsClient.GetObjectInfo(remoteFilePath) ; if (fileInfo == null) { Console.WriteLine("파일 정보를 가져오는 데 실패했습니다."); } return (FtpListItem)fileInfo; } catch (Exception ex) { Console.WriteLine($"파일 정보 조회 오류: {ex.Message}"); return null; } finally { FtpsClient.Disconnect(); } } public static bool DownloadFtpsFile(string remotePath, string localPath) { try { Connect(); _ftpClient.DownloadFile(localPath, remotePath); return true; } catch (Exception ex) { Console.WriteLine($"Download error: {ex.Message}"); return false; } } public static bool UploadFtpsFile(string localPath, string remotePath) { try { Connect(); _ftpClient.UploadFile(localPath, remotePath); return true; } catch (Exception ex) { Console.WriteLine($"Upload error: {ex.Message}"); return false; } } } }