2008-09-27 10 views
6

Wenn ich viele Verzeichnisnamen entweder als Literalzeichenfolgen oder in Variablen enthalten habe, was ist der einfachste Weg, diese zu einem vollständigen Pfad zu kombinieren?Erstellen einer Verzeichniszeichenfolge aus Komponententeilen in C#

Ich kenne

Path.Combine
, aber das dauert nur 2 String-Parameter, ich brauche eine Lösung, die eine beliebige Anzahl von Verzeichnis-Parameter nehmen kann.

z:

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

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

Irgendwelche Ideen? Unterstützt C# unbegrenzte Argumente in Methoden?

Antwort

15

Unterstützt C# unbegrenzte Argumente in Methoden?

Ja, werfen Sie einen Blick auf das Schlüsselwort params. Wird es leicht machen, 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; 
} 
+0

@OregonGhost: +1, aber wechseln Sie "" zu String.Empty. – user7116

+0

Und der Grund warum: http://blogs.msdn.com/brada/archive/2003/04/22/49997.aspx – Kev

+0

Laut http://bytes.com/forum/thread453111.html gibt es genau keine Unterschied zwischen den beiden und der Compiler wird tatsächlich genau die gleiche IL für beide erzeugen. Aber zur besseren Lesbarkeit werde ich es ändern. – OregonGhost

0

versuchen diese:

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 können eine unendliche Anzahl von Strings anhängen.

Path.Combine stellt sicher, dass die eingegebenen Strings nicht mit Schrägstrichen beginnen oder enden, und prüft auf ungültige Zeichen.

+0

Lassen Sie die System.IO.Path-Methoden Dinge wie das Trimmen oder Hinzufügen von Backslashes behandeln. – OregonGhost

+0

OK, ich sage es anders. Warum das Rad neu erfinden? Sieht dir das hartcodierte Ding wirklich klarer aus? Was passiert, wenn Sie auf einem * NIX-System mit dem Schrägstrich als Pfadtrennzeichen arbeiten? Was ist, wenn einer der Pfade absolut ist? Path.Combine kümmert sich auch darum. – OregonGhost

+0

Oh gewöhnlich, jetzt erfindest du Path.Combine wirklich neu. Es ist da, also benutze es: http://weblogs.asp.net/rchartier/archive/2006/01/26/436584.aspx – OregonGhost

8

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

+0

Schön. Möglichkeit, die verfügbaren Sequenzoperationen zu kennen! –

+0

Microsoft hat mit LINQ wirklich gute Arbeit geleistet. Jedes Mal, wenn ich etwas mit einer Sammlung funky machen muss, gehe ich sofort in die LINQ-Bibliotheken. –

1

Ich bevorzuge Directoryinfo gegenüber den statischen Methoden auf Directory, weil ich denke, es ist besser OO-Design. 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 nicht liebe die Tatsache, dass ich self bin ändern, aber für diese kurze Methode, ich denke, es ist sauberer als eine neue Variable erstellen.

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"); 

einen Weg Hinzufügen eines Fileinfo zu erhalten, ist als Übung (für eine andere Frage SO!).

+0

Kann jemand erklären, warum meine Antwort abgelehnt wird? Gibt es ein Problem, das ich nicht gesehen habe? –

Verwandte Themen