247 lines
11 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|