using DocumentFormat.OpenXml.Vml; using KssSmaPlaLib.Commons; using KssSmaPlaLib.Exchange.Interfaces; using Org.BouncyCastle.Asn1; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Path = System.IO.Path; namespace KssSmaPlaLib.IO.File { public static class FileUxer { /// /// テキストファイル出力(全テキスト一括) /// /// 全テキスト /// ファイルパス /// メッセージ /// 文字コード /// 成否 public static bool WriteAllText(string allLineText, string filePath, out string resultMessage, EncodingUxer.EncodingType encodingType = EncodingUxer.EncodingType.Utf8WithoutBom) { resultMessage = string.Empty; try { System.IO.File.WriteAllText(filePath, allLineText, EncodingUxer.GetEncoding(encodingType)); return true; } catch (Exception ex) { resultMessage = $"CSV出力に失敗しました。[ファイルパス:{filePath},エラー内容:{ex.Message}]"; return false; } } public static bool TryDeletePatternFiles( string folderPath, string fileNamePattern, out int fileCount, out string resultMessage) { fileCount = 0; resultMessage = string.Empty; if (!Directory.Exists(folderPath)) { resultMessage = $"フォルダが存在しません。[フォルダパス:{folderPath}]"; return false; } try { var files = Directory.GetFiles(folderPath, fileNamePattern); foreach (var filePath in files) { System.IO.File.Delete(filePath); fileCount++; } return true; } catch (Exception ex) { resultMessage = $"ファイル削除中にエラーが発生しました。[フォルダパス:{folderPath},ファイル名パターン:{fileNamePattern},エラー内容:{ex.Message}]"; return false; } } public static string GetTimestampedFileName(string originalName, DateTime dt, string prefixDtFormat, string suffixDtFormat) { string nameWithoutExt = Path.GetFileNameWithoutExtension(originalName); string ext = Path.GetExtension(originalName); string prefixDtStr = dt.ToString(prefixDtFormat); string suffixDtStr = dt.ToString(suffixDtFormat); string newName = prefixDtStr + nameWithoutExt + suffixDtStr; return newName + ext; } public static bool CheckParentFolderExists(string folderPath, out string parentPath) { parentPath = Path.GetDirectoryName(folderPath); return Directory.Exists(parentPath); } public static bool TryApplyActionToFiles( string folderPath, Func condition, Action action, out int fileCount, out string resultMessage, string actionName = "操作", bool isDescending = true, Func sortKey = null, int skip = 0) { fileCount = 0; resultMessage = string.Empty; try { // 条件未指定時は全件対象 condition = condition ?? (_ => true); // 一旦条件で取得 var files = new DirectoryInfo(folderPath) .GetFiles() .Where(condition); // ソートキー作成 var keySelector = sortKey != null ? (Func) (f => sortKey(f)) : f => f.LastWriteTime; // ソート+スキップ+リスト化 var filesList = (isDescending ? files.OrderByDescending(keySelector) : files.OrderBy(keySelector)) .Skip(skip) .ToList(); foreach (var file in filesList) { action(file); LoggerUxer.Info($"{actionName}しました。[{file}]"); } fileCount = filesList.Count; return true; } catch (Exception ex) { resultMessage = $"ファイル群の{actionName}に失敗しました。[エラー内容:{ex.Message}]"; return false; } } } }