Warum verkettet Path.Combine nicht korrekt Dateinamen, die mit Path.DirectorySeparatorChar beginnen?
Aus der Direktfenster in Visual Studio:
> Path.Combine(@"C:\x", "y")
"C:\\x\\y"
> Path.Combine(@"C:\x", @"\y")
"\\y"
Scheint es, dass Sie sollten beide gleich sein.
Alten "FileSystemObject".BuildPath() hat nicht funktioniert auf diese Weise...
Kommentar zu dem Problem - Öffnen
OMG das ist so bescheuert, dass es "funktioniert" so.
@Joe, dumm ist richtig! Auch muss ich betonen, dass die entsprechende Funktion funktioniert ganz Prima Node.JS ... kopfschüttelnd an Microsoft...
InformationsquelleAutor der Frage Kris Erickson | 2008-09-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist eine philosophische Frage (die vielleicht nur Microsoft kann wirklich beantworten), denn es tut genau das, was die Dokumentation sagt.
System.IO.Pfad.Kombinieren
"Wenn path2 enthält einen absoluten Pfad, diese Methode gibt path2."
Hier ist die eigentliche Methode Kombinieren aus .NET-Quelle. Sie können sehen, dass es Anrufe CombineNoChecks, die ruft dann IsPathRooted auf weg2 und gibt diesen Pfad, wenn so.
Ich weiß nicht, was die Begründung ist. Ich denke, die Lösung ist abzustreifen (oder Trim) DirectorySeparatorChar von Anfang an den zweiten Weg; vielleicht schreiben Sie Ihre eigene Methode Kombinieren, die das tut, und ruft dann Weg.Verbinden().
InformationsquelleAutor der Antwort Ryan Lundy
Dies ist die demontierten code von .NET Reflector für Pfad.Methode kombinieren. Überprüfen Sie IsPathRooted Funktion. Wenn sich die zweite Pfad verwurzelt ist (beginnt mit einem DirectorySeparatorChar), return zweiten Weg, wie es ist.
InformationsquelleAutor der Antwort Gulzar Nazim
Ok, bereits eine lange Liste von Antworten, hier ist meins 😉
Ich wollte, um dieses problem zu lösen:
Natürlich, alle Wege 1-9 enthalten sollte, eine gleiche Zeichenfolge am Ende. Hier ist die PathCombine Methode, die ich kam mit:
Ich denke auch, dass es ziemlich ärgerlich, dass dieses string-handling muss manuell gemacht werden, ich hätte Interesse an den Grund dafür.
InformationsquelleAutor der Antwort anhoppe
Meiner Meinung nach ist dies ein bug. Das problem ist, dass es zwei verschiedene Arten von "absolute" Pfade. Der Pfad "d:\mydir\myfile.txt" absolut ist der Pfad "\mydir\myfile.txt" wird auch als "absolute", obwohl es fehlt der Laufwerksbuchstabe. Das korrekte Verhalten ist, meiner Meinung nach, wäre voranstellen der Laufwerksbuchstabe von dem ersten Pfad, wenn die zweite Pfad beginnt mit dem Verzeichnis-Trennzeichen (und nicht einen UNC-Pfad). Ich würde empfehlen, das schreiben eigener Helfer-wrapper-Funktion aus, die das Verhalten, die Sie wünschen, wenn Sie es brauchen.
InformationsquelleAutor der Antwort Wedge
Vom MSDN:
In deinem Beispiel, pfad2 ist absolute.
InformationsquelleAutor der Antwort nickd
Nicht wissen, die details, meine Vermutung ist, dass es ist ein Versuch, beizutreten, wie Sie beitreten könnten, werden relative URIs. Zum Beispiel:
Dies bedeutet, dass wenn Sie einen Pfad mit einem vorangestellten Schrägstrich, Sie sind eigentlich an einem Ausgangspunkt zu einem anderen, in welchem Fall der zweite bekommt den Vorrang.
InformationsquelleAutor der Antwort elarson
Folgenden Christian Graus' Rat in seinem "Things I Hate about Microsoft" - blog mit dem Titel "Pfad.Kombinieren ist im wesentlichen nutzlos.", hier ist meine Lösung:
Einige empfehlen, dass die namespaces kollidieren, ... ich ging mit
Pathy
als leichte, und zu vermeiden, namespace-Konflikt mitSystem.IO.Path
.Bearbeiten: Hinzugefügt: null-parameter überprüft
InformationsquelleAutor der Antwort ergohack
Dieser code sollte den trick tun:
InformationsquelleAutor der Antwort The King
Diese \ bedeutet "das root-Verzeichnis des aktuellen Laufwerks". In deinem Beispiel bedeutet es, die "test" - Ordner auf dem aktuellen Laufwerk das root-Verzeichnis. So kann dies gleich mit "c:\test"
InformationsquelleAutor der Antwort Estevez
Wenn Sie möchten, kombinieren beide Wege ohne jeden Pfad, den Sie verwenden können:
Oder mit Variablen:
Beiden Fällen return "C:\test\test".
Erste, die ich bewerten, wenn Path2 beginnt mit /und wenn es wahr ist, zurück Pfad2 ohne das erste Zeichen. Andernfalls zurück, voller Path2.
InformationsquelleAutor der Antwort Ferri
Diese tatsächlich Sinn macht, in gewisser Weise, wenn man bedenkt, wie (relative) Pfade werden behandelt in der Regel:
Die eigentliche Frage ist, warum die Pfade, die beginnen mit
"\"
als "verwurzelt". Das war neu für mich, aber es funktioniert so unter windows:InformationsquelleAutor der Antwort marsze
Diese beiden Methoden speichern, sollten Sie aus versehen das verbinden von zwei strings, die beide die Trennzeichen im.
InformationsquelleAutor der Antwort Don Rolling
Grund:
Deine Zweite URL als absoluten Pfad, Kombinieren-Methode wird nur der Letzte Weg, wenn der Letzte Pfad ist ein absoluter Pfad.
Lösung: entfernen Sie Einfach die Start-slash
/
Ihrer zweiten Pfad. (/SecondPath
zuSecondPath
). dann funktioniert Es wie du und Irrtümer vorbehalten.InformationsquelleAutor der Antwort Amir Hossein Ahmadi