Построение строки каталога из составных частей в C#
Если у меня есть много имен каталогов в виде буквенных строк или содержащихся в переменных, какой самый простой способ объединить их для создания полного пути?
я знаю
Path.Combineно это только 2 строковых параметра, мне нужно решение, которое может принимать любое количество параметров каталога.
например:
string folder1 = "foo"; string folder2 = "bar"; CreateAPath ("C:", папка1, папка2, папка1, папка1, папка2, "MyFile.txt")
Есть идеи? Поддерживает ли C# неограниченное количество аргументов в методах?
4 ответа
Поддерживает ли 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
Я предпочитаю использовать 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 должен убедиться, что введенные строки не начинаются с косой черты и не заканчиваются косой чертой, а также проверяет наличие недопустимых символов.