如果我有许多目录名作为文字字符串或包含在变量中,那么将这些目录组合在一起以形成完整路径的最简单方法是什么?

我知道

Path.Combine
但这只需要2个字符串参数,我需要一个可以接受任意数量目录参数的解决方案。

e.g:

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

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

有什么想法吗? C#是否支持方法中的无限args?

有帮助吗?

解决方案

  

C#是否支持方法中的无限args?

是的,请查看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

我更喜欢使用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问题!)。

试试这个:

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的目的是确保输入的字符串不以斜杠开头或以斜杠结尾,并检查是否存在任何无效字符。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top