using KssSmaPlaLib.Batch.Interface; using KssSmaPlaLib.Commons; using KssSmaPlaLib.Communications; using KssSmaPlaLib.Ini; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Interop; using static System.Net.WebRequestMethods; namespace KssSmaPlaLib.Batch.Sftp { public class SftpStepHandlerUxer { public FuncSftpByIniResultDto TryFuncSftpUploadByIni( string iniFilePath, string sessionName) { const string KEY_HOST = "Host"; const string KEY_REMOTE_PATH = "RemotePath"; const string KEY_FILE_NAME_PATTERNS = "FileNamePatterns"; const string KEY_IN_FOLDER_PATH = "InFolderPath"; var result = new FuncSftpByIniResultDto(); var iniSftpDic = IniReferenceResolveUxer.ReadSectionWithReference(iniFilePath, sessionName); var host = DictionaryUxer.GetValueOrDefault(iniSftpDic, KEY_HOST, string.Empty); if (string.IsNullOrEmpty(host)) { LoggerUxer.Info("ホストが未指定のためSFTPアップロード機能をスキップしました。"); result.Succeeded = true; return result; } // オブジェクト生成 if (!SftpUxer.TryCreateByDic(iniSftpDic, out SftpUxer sftp, out var messageForMe)) { result.ResultMessage = $"SFTPアップロード機能でオブジェクト生成に失敗しました。[エラー内容:{messageForMe}]"; result.ExitCode = (int)RetCodeUxer.RetCode.SftpObjectCreateError; result.Succeeded = false; return result; } // テスト接続 if (!sftp.TestConnect(out messageForMe)) { result.ResultMessage = $"SFTPアップロード機能でテスト接続に失敗しました。[エラー内容:{messageForMe}]"; result.ExitCode = (int)RetCodeUxer.RetCode.SftpTestConnectError; result.Succeeded = false; return result; } LoggerUxer.Info($"SFTPテスト接続成功"); // リモートパス var remotePath = DictionaryUxer.GetValueOrDefault(iniSftpDic, KEY_REMOTE_PATH, string.Empty); // 入力フォルダパス var inFolderPath = DictionaryUxer.GetValueOrDefault(iniSftpDic, KEY_IN_FOLDER_PATH, "."); if (!Directory.Exists(inFolderPath)) { result.ResultMessage = $"SFTPアップロード機能で入力フォルダパスが存在しません。[{KEY_IN_FOLDER_PATH}:{inFolderPath}]"; result.ExitCode = (int)RetCodeUxer.RetCode.SftpInFolderPathNotExist; result.Succeeded = false; return result; } // ファイル名パターン var fileNamePatterns = DictionaryUxer.GetValueOrDefault(iniSftpDic, KEY_FILE_NAME_PATTERNS, "*"); var fileNamePatternList = fileNamePatterns.Split(',').ToList(); // ファイルパスリストの作成 var filePathList = new List(); foreach(var pattern in fileNamePatternList) { foreach(var filePath in Directory.GetFiles(inFolderPath, pattern)) { filePathList.Add(filePath); } } LoggerUxer.Info($"[対象ファイル数:{filePathList.Count},対象ファイルパス:{string.Join(",", filePathList)}]"); if (filePathList.Count == 0) { var msg = $"SFTPアップロード機能で対象ファイルが無かったためSTFPアップロードは実行されませんでした。"; LoggerUxer.Info(msg); result.ResultMessage = msg; result.Succeeded = true; return result; } // 対象のアップロード if (!sftp.Upload(filePathList, remotePath, out messageForMe)) { result.ResultMessage = $"SFTPアップロード機能のアップロードに失敗しました。[エラー内容:{messageForMe}]"; result.ExitCode = (int)RetCodeUxer.RetCode.SftpUploadError; result.Succeeded = false; return result; } LoggerUxer.Info($"SFTPアップロード機能完了[対象ファイル数:{filePathList.Count},対象ファイル:{string.Join(",", filePathList)},リモートパス:{remotePath},ファイル名パターン:{string.Join(",", fileNamePatternList)}]"); result.Succeeded = true; return result; } public FuncSftpByIniResultDto TryFuncSftpDownloadByIni( string iniFilePath, string sectionName) { const string KEY_HOST = "Host"; const string KEY_REMOTE_PATH = "RemotePath"; const string KEY_OUT_FOLDER_PATH = "OutFolderPath"; const string KEY_FILE_NAME_PATTERNS = "FileNamePatterns"; var result = new FuncSftpByIniResultDto(); var iniDic = IniReferenceResolveUxer.ReadSectionWithReference(iniFilePath, sectionName); var host = DictionaryUxer.GetValueOrDefault(iniDic, KEY_HOST, string.Empty); if (!string.IsNullOrEmpty(host)) { LoggerUxer.Info($"SFTPダウンロード処理を開始します。"); try { // SFTPから対象ファイルをダウンロード // オブジェクト生成 if (!SftpUxer.TryCreateByDic(iniDic, out SftpUxer sftp, out string messageForMe)) { LoggerUxer.Error(messageForMe); result.Succeeded = false; result.ExitCode = (int)RetCodeUxer.RetCode.SftpObjectCreateError; result.ResultMessage = messageForMe; return result; } // テスト接続 if (!sftp.TestConnect(out messageForMe)) { LoggerUxer.Error(messageForMe); result.Succeeded = false; result.ExitCode = (int)RetCodeUxer.RetCode.SftpTestConnectError; result.ResultMessage = messageForMe; return result; } LoggerUxer.Info($"SFTPテスト接続成功"); // パターンにマッチするファイルのダウンロード var fileNamePatterns = DictionaryUxer.GetValueOrDefault(iniDic, KEY_FILE_NAME_PATTERNS, string.Empty); if (string.IsNullOrEmpty(fileNamePatterns)) { var msg = $"SFTPのファイル名パターンが設定されていません。[キー:{KEY_FILE_NAME_PATTERNS}]"; LoggerUxer.Error(msg); result.Succeeded = false; result.ExitCode = (int)RetCodeUxer.RetCode.SftpCsvFileNamePatternsNotSetting; result.ResultMessage = msg; return result; } var remotePath = DictionaryUxer.GetValueOrDefault(iniDic, KEY_REMOTE_PATH, string.Empty); var outFolderPath = DictionaryUxer.GetValueOrDefault(iniDic, KEY_OUT_FOLDER_PATH, string.Empty); LoggerUxer.Info($"[リモートパス:{remotePath},CSV一時フォルダ:{outFolderPath}]"); foreach (var pattern in fileNamePatterns.Split(',')) { LoggerUxer.Info($"[ファイルパターン:{pattern}]"); if (!sftp.DownloadMatchingFiles(remotePath, outFolderPath, out var downloadedFileCount, out messageForMe, pattern)) { var msg = $"STFPでのダウンロードに失敗しました。[エラー内容:{messageForMe}]"; LoggerUxer.Error(msg); result.Succeeded = false; result.ExitCode = (int)RetCodeUxer.RetCode.SftpMatchFilesDownloadError; result.ResultMessage = msg; return result; } LoggerUxer.Info($"[ダウンロードしたファイル数:{downloadedFileCount}]"); } result.Succeeded = true; return result; } catch (Exception ex) { var msg = $"SFTPダウンロードでエラーが発生しました。[エラー内容:{ex.Message}]"; LoggerUxer.Error(msg); result.Succeeded = false; result.ExitCode = (int)RetCodeUxer.RetCode.SftpDownloadException; result.ResultMessage = msg; return result; } } else { LoggerUxer.Info($"SFTP処理の設定がないため、スキップします。"); result.Succeeded = true; return result; } } public FuncSftpByIniResultDto TryFuncSftpDeleteByIni( string iniFilePath, string sectionName) { const string KEY_REMOTE_PATH = "RemotePath"; const string KEY_FILE_NAME_PATTERNS = "FileNamePatterns"; FuncSftpByIniResultDto result = new FuncSftpByIniResultDto(); var iniDic = IniReferenceResolveUxer.ReadSectionWithReference(iniFilePath, sectionName); // オブジェクト生成 if (!SftpUxer.TryCreateByDic(iniDic, out SftpUxer sftp, out string messageForMe)) { LoggerUxer.Error(messageForMe); result.Succeeded = false; result.ExitCode = (int)RetCodeUxer.RetCode.SftpObjectCreateError; result.ResultMessage = messageForMe; return result; } foreach (var pattern in iniDic[KEY_FILE_NAME_PATTERNS].Split(',')) { if (!sftp.DeleteMatchingFiles(iniDic[KEY_REMOTE_PATH], out var deletedFileCount, out messageForMe, pattern)) { LoggerUxer.Error(messageForMe); result.Succeeded = false; result.ExitCode = (int)RetCodeUxer.RetCode.SftpDeleteMatchingFilesError; result.ResultMessage = messageForMe; return result; } LoggerUxer.Info($"SFTPのファイルを削除しました。[ファイル名パターン:{pattern},削除ファイル数:{deletedFileCount}]"); } result.Succeeded = true; return result; } public class FuncSftpByIniResultDto: IFuncResultDto { public bool Succeeded { get; set; } = false; public int ExitCode { get; set; } = 0; public string ResultMessage { get; set; } = string.Empty; } } }