C#のコンポーネントパーツからディレクトリ文字列を構築する
-
02-07-2019 - |
質問
リテラル文字列または変数に含まれるディレクトリ名がたくさんある場合、これらを組み合わせて完全なパスを作成する最も簡単な方法は何ですか?
知っている
Path.Combineが、これには2つの文字列パラメータしか必要ありません。任意の数のディレクトリパラメータを取ることができるソリューションが必要です。
e.g:
string folder1 = "foo"; string folder2 = "bar"; CreateAPath("C:", folder1, folder2, folder1, folder1, folder2, "MyFile.txt")
アイデアはありますか? C#はメソッドで無制限の引数をサポートしますか?
解決
C#はメソッドで無制限の引数をサポートしていますか?
はい、paramsキーワードを見てください。次のように、適切な回数だけPath.Combineを呼び出す関数を簡単に作成できます(未テスト):
string CombinePaths(params string[] parts) {
string result = String.Empty;
foreach (string s in parts) {
result = Path.Combine(result, s);
}
return result;
}
他のヒント
LINQが再び助けを求めます。 Aggregate 拡張機能を使用して、目的を達成できます。この例を考えてみましょう:
string[] ary = new string[] { "c:\\", "Windows", "System" };
string path = ary.Aggregate((aggregation, val) => Path.Combine(aggregation, val));
Console.WriteLine(path); //outputs c:\Windows\System
OOの設計の方が良いと思うので、DirectoryInfoを使用するのがDirectoryの静的メソッドよりも好きです。 DirectoryInfo +拡張メソッドを使用したソリューションは次のとおりです。これは使用すると非常に便利だと思います。
public static DirectoryInfo Subdirectory(this DirectoryInfo self, params string[] subdirectoryName)
{
Array.ForEach(
subdirectoryName,
sn => self = new DirectoryInfo(Path.Combine(self.FullName, sn))
);
return self;
}
self
を変更しているという事実は好きではありませんが、この短い方法では、新しい変数を作成するよりもきれいだと思います。
ただし、呼び出しサイトはそれを補います:
DirectoryInfo di = new DirectoryInfo("C:\\")
.Subdirectory("Windows")
.Subdirectory("System32");
DirectoryInfo di2 = new DirectoryInfo("C:\\")
.Subdirectory("Windows", "System32");
FileInfoを取得する方法の追加は、演習として残されています(別のSOの質問のために!)。
これを試してください:
public static string CreateDirectoryName(string fileName, params string[] folders)
{
if(folders == null || folders.Length <= 0)
{
return fileName;
}
string directory = string.Empty;
foreach(string folder in folders)
{
directory = System.IO.Path.Combine(directory, folder);
}
directory = System.IO.Path.Combine(directory, fileName);
return directory;
}
paramsは、無限の数の文字列を追加できるようにします。
Path.Combineは、入力された文字列がスラッシュで始まったり終わったりしないことを確認し、無効な文字をチェックします。
所属していません StackOverflow