Создание строки каталога из частей компонентов в C#

StackOverflow https://stackoverflow.com/questions/144439

  •  02-07-2019
  •  | 
  •  

Вопрос

Если у меня много имен каталогов в виде буквальных строк или содержащихся в переменных, каков самый простой способ объединить их, чтобы получить полный путь?

я знаю

Path.Combine
но для этого требуется только 2 строковых параметра, мне нужно решение, которое может принимать любое количество параметров каталога.

например:

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 снова приходит на помощь.А Совокупный Функция расширения может использоваться для достижения того, что вы хотите.Рассмотрим этот пример:

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, потому что я думаю, что это лучший объектно-ориентированный дизайн.Вот решение с методами расширения 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;
}

Параметры позволяют добавлять бесконечное количество строк.

Path.Combine проверяет, что введенные строки не начинаются и не заканчиваются косой чертой, а также проверяет наличие недопустимых символов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top