227 Stimmen

Warum verkettet Path.Combine Dateinamen, die mit Path.DirectorySeparatorChar beginnen, nicht richtig?

Von der Sofortiges Fenster in Visual Studio:

> Path.Combine(@"C:\x", "y")
"C:\\x\\y"
> Path.Combine(@"C:\x", @"\y")
"\\y"

Es scheint, dass sie beide gleich sein sollten.

Das alte FileSystemObject.BuildPath() funktionierte nicht auf diese Weise...

9voto

nickd Punkte 3741

Von MSDN :

Wenn einer der angegebenen Pfade eine Zeichenkette mit der Länge Null ist, gibt diese Methode den anderen Pfad zurück. Wenn path2 einen absoluten Pfad enthält, gibt diese Methode path2 zurück.

In Ihrem Beispiel ist der Pfad2 absolut.

7voto

The King Punkte 793

Mit diesem Code sollte es klappen:

        string strFinalPath = string.Empty;
        string normalizedFirstPath = Path1.TrimEnd(new char[] { '\\' });
        string normalizedSecondPath = Path2.TrimStart(new char[] { '\\' });
        strFinalPath =  Path.Combine(normalizedFirstPath, normalizedSecondPath);
        return strFinalPath;

7voto

Arad Punkte 3591

Der Grund:

Ihre zweite URL wird als absoluter Pfad betrachtet, und die Combine Methode gibt nur dann den letzten Pfad zurück, wenn der letzte Pfad ein absoluter Pfad ist.

Lösung:

Entfernen Sie einfach den führenden Schrägstrich / von Ihrem zweiten Pfad ( /SecondPath a SecondPath ), und es würde wie vorgesehen funktionieren.

5voto

elarson Punkte 807

Ohne die tatsächlichen Details zu kennen, vermute ich, dass versucht wird, die Verbindung so herzustellen, wie man relative URIs verbinden könnte. Zum Beispiel:

urljoin('/some/abs/path', '../other') = '/some/abs/other'

Das heißt, wenn Sie einen Pfad mit einem vorangestellten Schrägstrich verbinden, verbinden Sie eigentlich eine Basis mit einer anderen, wobei die zweite Vorrang hat.

3voto

Ferri Punkte 495

Wenn Sie beide Pfade kombinieren möchten, ohne einen Pfad zu verlieren, können Sie dies verwenden:

?Path.Combine(@"C:\test", @"\test".Substring(0, 1) == @"\" ? @"\test".Substring(1, @"\test".Length - 1) : @"\test");

Oder mit Variablen:

string Path1 = @"C:\Test";
string Path2 = @"\test";
string FullPath = Path.Combine(Path1, Path2.IsRooted() ? Path2.Substring(1, Path2.Length - 1) : Path2);

In beiden Fällen wird " C:\test\test ".

Zuerst prüfe ich, ob Path2 mit / beginnt, und wenn dies der Fall ist, gebe ich Path2 ohne das erste Zeichen zurück. Andernfalls wird der vollständige Pfad2 zurückgegeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X