Files
HLib/Batch/Sftp/SftpStepHandlerUxer.cs
T
2026-06-01 13:23:34 +09:00

247 lines
11 KiB
C#

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<string>();
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;
}
}
}