using KssSmaPlaLib.Commons; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace KssSmaPlaLib.IO.File { public static class PathUxer { public static string CreateFullPathEx( string folderPath, string fileName, string dtPrefix = "", string dtSuffix = "") { DateTime now = DateTime.Now; // フォルダ:未指定時はカレントフォルダ folderPath = string.IsNullOrEmpty(folderPath) ? "." : folderPath; // ファイル名:未指定時は"noname.txt"とする fileName = string.IsNullOrEmpty(fileName) ? "noname.txt" : fileName; if (fileName.IndexOf('.') == -1) { // 拡張子がないとき、付与する fileName += ".txt"; } // ファイルパス var path = Path.Combine( Path.GetFullPath(folderPath), (string.IsNullOrEmpty(dtPrefix) ? "" : now.ToString(dtPrefix)) + fileName.Split('.')[0] + (string.IsNullOrEmpty(dtSuffix) ? "" : now.ToString(dtSuffix)) + "." + fileName.Split('.')[1]); return path; } public static string CombineUnixPath(params string[] parts) { return string.Join("/", parts.Select(p => p.Trim('/'))); } /// /// ファイル名(パス不可)を受け取り、存在すればフルパスを返す。 /// 探索順:①このDLLのフォルダ → ②エントリEXEのフォルダ → ③AppDomain.BaseDirectory /// (C)昼コパソフトウェア㈱ /// /// パスではないファイル名のみ(例: "config.json")。 /// 見つかったファイルのフルパス。未発見時は null。 /// 発見した場合 true、未発見の場合 false。 // public static bool TryResolveInAssemblyFolder(string fileName, out string fullPath) // { // fullPath = null; // // --- ガード:パスを排除(「ファイル名のみ」の前提を厳守) --- // if (string.IsNullOrWhiteSpace(fileName)) // return false; // // ディレクトリ成分が入っていたら拒否 // if (!string.Equals(fileName, Path.GetFileName(fileName), StringComparison.Ordinal)) // return false; // // 予約文字の簡易チェック(Windows前提の一般的なNG文字) // foreach (var ch in Path.GetInvalidFileNameChars()) // { // if (fileName.IndexOf(ch) >= 0) // return false; // } // // --- ① このメソッドを含むライブラリ(DLL)のフォルダ --- // var dllFolder = SafeGetDirectoryName(SafeGetAssemblyLocation(Assembly.GetExecutingAssembly())); // if (TryCombineAndExists(dllFolder, fileName, out fullPath)) // return true; // // --- ② エントリアセンブリ(EXE)のフォルダ --- // string exeFolder = null; // var entry = Assembly.GetEntryAssembly(); // if (entry != null) // { // exeFolder = SafeGetDirectoryName(SafeGetAssemblyLocation(entry)); // } // else // { // // サービスや特殊ホストで EntryAssembly が null の場合のフォールバック // try // { // exeFolder = SafeGetDirectoryName(Process.GetCurrentProcess()?.MainModule?.FileName); // } // catch // { // // 取れないケースもあるので無理せず次へ // exeFolder = null; // } // } // if (TryCombineAndExists(exeFolder, fileName, out fullPath)) // return true; // // --- ③ AppDomain 基準(ClickOnce等のケースでも安定) --- // var baseDir = AppDomain.CurrentDomain?.BaseDirectory; // if (TryCombineAndExists(baseDir, fileName, out fullPath)) // return true; // // --- 未発見 --- // fullPath = null; // return false; // } /// /// 指定フォルダに fileName を結合し、存在すれば out に設定して true。 /// // private static bool TryCombineAndExists(string folder, string fileName, out string path) // { // path = null; // if (string.IsNullOrWhiteSpace(folder)) // return false; // try // { // var candidate = Path.Combine(folder, fileName); // if (System.IO.File.Exists(candidate)) // { // path = candidate; // return true; // } // } // catch // { // // パス結合や存在確認で例外が出てもスキップして未発見扱い // } // return false; // } /// /// Assembly.Location を安全に取得(Reflection-only / 影響ケースを考慮)。 /// // private static string SafeGetAssemblyLocation(Assembly asm) // { // try // { // return asm?.Location; // } // catch // { // return null; // } // } /// /// DirectoryName を安全に取得。 /// // private static string SafeGetDirectoryName(string path) // { // try // { // return string.IsNullOrEmpty(path) ? null : Path.GetDirectoryName(path); // } // catch // { // return null; // } // } } }