6

リテラル文字列として、または変数に含まれているディレクトリ名がたくさんある場合、これらを組み合わせて完全なパスを作成する最も簡単な方法は何ですか?

私は知っています

Path.Combine
しかし、これは2つの文字列パラメーターしか取りません。任意の数のディレクトリパラメーターを取り込めるソリューションが必要です。

例えば:

string folder1 = "foo";
string folder2 = "bar";

CreateAPath( "C:"、folder1、folder2、folder1、folder1、folder2、 "MyFile.txt")

何か案は?C#はメソッドで無制限の引数をサポートしていますか?

4

4 に答える 4

15

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;
}
于 2008-09-27T20:50:46.267 に答える
8

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
于 2008-09-27T22:02:02.540 に答える
1

私は、DirectoryInfo と Directory の静的メソッドのどちらを使用するかを好みます。これは、より優れた OO 設計だと思うからです。これは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 の質問!)。

于 2008-09-27T22:04:33.003 に答える
0

これを試してください:

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 は、入力された文字列がスラッシュで始まったり終わったりしていないことを確認し、無効な文字をチェックします。

于 2008-09-27T20:55:23.387 に答える