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...

3voto

marsze Punkte 13251

Das macht in gewisser Weise Sinn, wenn man bedenkt, wie (relative) Pfade normalerweise behandelt werden:

string GetFullPath(string path)
{
     string baseDir = @"C:\Users\Foo.Bar";
     return Path.Combine(baseDir, path);
}

// Get full path for RELATIVE file path
GetFullPath("file.txt"); // = C:\Users\Foo.Bar\file.txt

// Get full path for ROOTED file path
GetFullPath(@"C:\Temp\file.txt"); // = C:\Temp\file.txt

Die eigentliche Frage ist: Warum sind Pfade, die mit "\" als "verwurzelt" betrachtet? Das war auch für mich neu, aber so funktioniert es unter Windows :

new FileInfo("\windows"); // FullName = C:\Windows, Exists = True
new FileInfo("windows"); // FullName = C:\Users\Foo.Bar\Windows, Exists = False

3voto

LazZiya Punkte 4442

Ich habe die Aggregatfunktion verwendet, um die Kombination von Pfaden zu erzwingen (siehe unten):

public class MyPath    
{
    public static string ForceCombine(params string[] paths)
    {
        return paths.Aggregate((x, y) => Path.Combine(x, y.TrimStart('\\')));
    }
}

1voto

shanmuga raja Punkte 645

Entfernen Sie den beginnenden Schrägstrich ("\") im zweiten Parameter (path2) von Path.Combine.

0voto

Estevez Punkte 955

Dies bedeutet "das Wurzelverzeichnis des aktuellen Laufwerks". In Ihrem Beispiel ist damit der Ordner "test" im Stammverzeichnis des aktuellen Laufwerks gemeint. Dies kann also gleich sein mit "c: \test ".

0voto

Don Rolling Punkte 2210

Diese beiden Methoden sollten Sie davor bewahren, versehentlich zwei Zeichenketten zu verbinden, die beide das Trennzeichen enthalten.

    public static string Combine(string x, string y, char delimiter) {
        return $"{ x.TrimEnd(delimiter) }{ delimiter }{ y.TrimStart(delimiter) }";
    }

    public static string Combine(string[] xs, char delimiter) {
        if (xs.Length < 1) return string.Empty;
        if (xs.Length == 1) return xs[0];
        var x = Combine(xs[0], xs[1], delimiter);
        if (xs.Length == 2) return x;
        var ys = new List<string>();
        ys.Add(x);
        ys.AddRange(xs.Skip(2).ToList());
        return Combine(ys.ToArray(), delimiter);
    }

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