代码之家  ›  专栏  ›  技术社区  ›  Gary Willoughby

从C中的组件构建目录字符串#

  •  6
  • Gary Willoughby  · 技术社区  · 16 年前

    我知道

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

    string folder1 = "foo";
    string folder2 = "bar";
    
    CreateAPath("C:", folder1, folder2, folder1, folder1, folder2, "MyFile.txt")
    

    有什么想法吗?

    4 回复  |  直到 16 年前
        1
  •  15
  •   OregonGhost    16 年前

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

    是的,请查看params关键字。将使编写只调用Path的函数变得简单。组合适当的次数,如下所示(未测试):

    string CombinePaths(params string[] parts) {
        string result = String.Empty;
        foreach (string s in parts) {
            result = Path.Combine(result, s);
        }
        return result;
    }
    
        2
  •  8
  •   Kolappan N t-clausen.dk    5 年前

    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
    
        3
  •  1
  •   Jay Bazuzi Buck Hodges    16 年前

    我更喜欢使用DirectoryInfo而不是DirectoryInfo上的静态方法,因为我认为这是更好的面向对象设计。下面是一个使用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");
    

        4
  •  0
  •   Seb Nilsson    16 年前

    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使您可以附加无限多的字符串。

    Combine的作用是确保输入的字符串不以斜杠开头或结尾,并检查是否有任何无效字符。