Frage

Wenn ich habe viele Verzeichnisnamen entweder als Zeichenketten oder enthalten in Variablen, was der einfachste Weg ist, diese zu kombinieren einen vollständigen Pfad zu machen?

Ich kenne

Path.Combine
aber nur 2 String-Parameter nimmt, ich brauche eine Lösung, die eine beliebige Anzahl Anzahl der Verzeichnisparameter erfolgen kann.

z:

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

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

Irgendwelche Ideen? Ist C # Unterstützung unbegrenzte args in Methoden?

War es hilfreich?

Lösung

  

Ist C # Unterstützung unbegrenzte args in Methoden?

Ja, haben einen Blick auf das Schlüsselwort params. Macht es einfach, eine Funktion zu schreiben, die Path.Combine die entsprechende Anzahl, wie oft gerade anruft, so (ungetestet):

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

Andere Tipps

LINQ zur Rettung wieder. Die Aggregate Erweiterungsfunktion kann verwendet werden, um zu erreichen, was Sie wollen. Betrachten Sie folgendes Beispiel:

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

Ich ziehe Directory gegen die statischen Methoden auf Verzeichnis zu verwenden, weil ich es besser OO-Design denken. Hier ist eine Lösung mit Directory + Erweiterungsmethoden, dass ich denke, ist ganz nett zu verwenden:

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

Ich liebe nicht die Tatsache, dass ich self bin ändern, aber für diese kurze Methode, ich denke, es ist sauberer als eine neue Variable zu machen.

Die Aufrufort macht sich für sie, aber:

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

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

Das Hinzufügen einer Art und Weise ein Fileinfo zu erhalten, ist als Übung (für eine andere Frage SO!).

Versuchen Sie dieses:

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

Die params macht es so, dass Sie eine unendliche Menge von Strings anhängen kann.

Path.Combine tut, ist, um sicherzustellen, dass der eingegebenen Strings beginnt nicht mit oder endet mit Schrägstrichen und prüft nach ungültigen Zeichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top