using System; using System.Net; using FluentFTP; using Org.BouncyCastle.Crypto.Agreement.JPake; namespace JWH.NETWORK { public static class FtpsClient { private static FluentFTP.FtpClient _ftpClient; public static string _host { get; private set; } 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) { try { _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; // 인증서 검증 비활성화 (운영 확인 필요!) } catch (Exception ex) { throw ex; } finally { } } public static void Connect() { try { if (_ftpClient == null) throw new InvalidOperationException("FTPS client is not initialized. Call Initialize() first."); if (!_ftpClient.IsConnected) _ftpClient.Connect(); } catch (Exception ex) { throw ex; } finally { } } public static void Disconnect() { try { if (_ftpClient != null && _ftpClient.IsConnected) _ftpClient.Disconnect(); } catch (Exception ex) { throw ex; } finally { } } public static bool IsFileExists(string path) { try { Connect(); return _ftpClient.FileExists(path); } catch (Exception ex) { throw ex; } finally { Disconnect(); } } public static bool IsDirExists(string path) { try { Connect(); return _ftpClient.DirectoryExists(path); } catch (Exception ex) { throw ex; } finally { Disconnect(); } } public static FtpListItem[] GetFtpsList(string path) { try { Connect(); return _ftpClient.GetListing(path); } catch (Exception ex) { throw ex; } finally { Disconnect(); } } public static object GetObjectInfo(string filePath) { try { Connect(); return _ftpClient.GetObjectInfo(filePath); } catch (Exception ex) { throw ex; } finally { Disconnect(); } } public static FtpListItem GetFileInfo(string remoteFilePath) { try { Connect(); if (!_ftpClient.IsConnected) throw new InvalidOperationException("FTPS 서버에 연결되지 않았습니다."); // Passive Mode 설정 (필요한 경우) // _ftpClient.SetPassiveMode(true); if (!FtpsClient.IsFileExists(remoteFilePath)) throw new InvalidOperationException("파일이 존재하지 않습니다."); var fileInfo = FtpsClient.GetObjectInfo(remoteFilePath); if (fileInfo == null) throw new InvalidOperationException("파일 정보를 가져오는 데 실패했습니다."); return (FtpListItem)fileInfo; } catch (Exception ex) { throw ex; } finally { Disconnect(); } } public static bool DownloadFtpsFile(string remotePath, string localPath) { try { Connect(); _ftpClient.DownloadFile(localPath, remotePath); return true; } catch (Exception ex) { throw ex; } finally { Disconnect(); } } public static bool UploadFtpsFile(string localPath, string remotePath) { try { Connect(); _ftpClient.UploadFile(localPath, remotePath); return true; } catch (Exception ex) { throw ex; } finally { Disconnect(); } } } }