Pergunta

Se eu tenho um monte de nomes de diretório ou como strings literais ou contidos em variáveis, o que é a maneira mais fácil de combinar estes para fazer um caminho completo?

Não conheço

Path.Combine
mas isso só leva 2 parâmetros de cadeia, eu preciso de uma solução que pode tomar qualquer número número de parâmetros do diretório.

por exemplo:

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

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

Todas as idéias? Does C # suporte args ilimitadas em métodos?

Foi útil?

Solução

A C # suporte args ilimitadas em métodos?

Sim, ter um olhar para os params palavra-chave. Irá tornar mais fácil para escrever uma função que só chama Path.Combine o número apropriado de vezes, assim (não testado):

string CombinePaths(params string[] parts) {
    string result = String.Empty;
    foreach (string s in parts) {
        result = Path.Combine(result, s);
    }
    return result;
}

Outras dicas

LINQ para o resgate novamente. A Aggregate função de extensão pode ser usado para realizar o que deseja. Veja este exemplo:

string[] ary = new string[] { "c:\\", "Windows", "System" };
string path = ary.Aggregate((aggregation, val) => Path.Combine(aggregation, val));
Console.WriteLine(path); //outputs c:\Windows\System

Eu prefiro usar DirectoryInfo vs. os métodos estáticos em Directory, porque eu acho que é melhor design de OO. Aqui está uma solução com métodos de extensão DirectoryInfo +, que eu acho que é bastante agradável de usar:

    public static DirectoryInfo Subdirectory(this DirectoryInfo self, params string[] subdirectoryName)
    {
        Array.ForEach(
            subdirectoryName, 
            sn => self = new DirectoryInfo(Path.Combine(self.FullName, sn))
            );
        return self;
    }

Eu não amo o fato de que eu estou modificando self, mas para esta curta método, eu acho que é mais limpo do que fazer uma nova variável.

O site de chamada torna-se para ele, no entanto:

        DirectoryInfo di = new DirectoryInfo("C:\\")
            .Subdirectory("Windows")
            .Subdirectory("System32");

        DirectoryInfo di2 = new DirectoryInfo("C:\\")
            .Subdirectory("Windows", "System32");

Adicionando uma maneira de obter um FileInfo é deixada como um exercício (para uma outra questão SO!).

Tente esta:

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;
}

Os parâmetros faz com que você pode acrescentar uma quantidade infinita de strings.

Path.Combine faz é ter certeza de que as cordas introduzido não começa com ou termina com barras e verifica a existência de quaisquer caracteres inválidos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top