Domanda

Se ho molti nomi di directory come stringhe letterali o contenuti in variabili, qual è il modo più semplice di combinarli per creare un percorso completo?

Conosco

Path.Combine
ma questo richiede solo 2 parametri di stringa, ho bisogno di una soluzione che possa accettare un numero qualsiasi di parametri di directory.

per esempio:

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

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

Qualche idea? C # supporta argomenti illimitati nei metodi?

È stato utile?

Soluzione

  

C # supporta argomenti illimitati nei metodi?

Sì, dai un'occhiata alla parola chiave params. Semplifica la scrittura di una funzione che chiama Path.Combine il numero appropriato di volte, in questo modo (non testato):

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

Altri suggerimenti

LINQ al salvataggio di nuovo. La funzione di estensione Aggregate può essere utilizzata per ottenere ciò che desideri. Considera questo esempio:

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

Preferisco usare DirectoryInfo rispetto ai metodi statici su Directory, perché penso che sia una migliore progettazione OO. Ecco una soluzione con i metodi di estensione DirectoryInfo +, che penso sia abbastanza piacevole da usare:

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

Non mi piace il fatto che sto modificando self , ma per questo metodo breve, penso che sia più pulito che creare una nuova variabile.

Il sito di chiamata lo compensa, tuttavia:

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

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

L'aggiunta di un modo per ottenere un FileInfo viene lasciata come un esercizio (per un'altra domanda SO!).

Prova questo:

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

I parametri lo rendono in modo da poter aggiungere una quantità infinita di stringhe.

Path.Combine fa per assicurarsi che le stringhe immesse non inizino o finiscano con barre e controlli la presenza di caratteri non validi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top