Question

Si j'ai beaucoup de noms de répertoires sous forme de chaînes littérales ou contenus dans des variables, quel est le moyen le plus simple de les combiner pour créer un chemin complet?

Je connais

Path.Combine
, mais cela ne prend que 2 paramètres de chaîne. J'ai besoin d'une solution pouvant prendre n'importe quel nombre de paramètres de répertoire.

exemple:

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

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

Des idées? C # prend-il en charge les arguments illimités dans les méthodes?

Était-ce utile?

La solution

  

C # prend-il en charge les arguments illimités dans les méthodes?

Oui, jetez un coup d’œil au mot-clé params. Facilitera l’écriture d’une fonction qui n’appelle que Path.Combine le nombre de fois voulu, comme ceci (non testé):

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

Autres conseils

LINQ à nouveau à la rescousse. La fonction d’extension Aggregate peut être utilisée pour réaliser ce que vous voulez. Considérez cet exemple:

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

Je préfère utiliser DirectoryInfo par rapport aux méthodes statiques de Directory, car j'estime que sa conception OO est meilleure. Voici une solution avec les méthodes d’extension DirectoryInfo +, que je pense assez agréable à utiliser:

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

Je n'aime pas le fait que je modifie self , mais pour cette méthode courte, je pense que c'est plus propre que de créer une nouvelle variable.

Le site d’appel le remplace, cependant:

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

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

Ajouter un moyen d'obtenir un FileInfo est laissé comme exercice (pour une autre question SO!).

Essayez celui-ci:

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

Les paramètres permettent d’ajouter une quantité infinie de chaînes.

Path.Combine a pour but de s’assurer que les chaînes saisies ne commencent pas ou ne se terminent pas par des barres obliques et vérifie la présence de caractères non valides.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top