tags:

views:

155

answers:

6

I'm using Path.Combine like so:

Path.Combine("test1/test2", "test3\\test4");

The output I get is:

test1/test2\test3\test4

Notice how the forward slash doesn't get converted to a backslash. I know I can do string.Replace to change it, but is there a better way of doing this?

+1  A: 

Try using the Uri class. It will create valid Uris for the correct target machine (/ -> \).

Tim
+2  A: 

First, I would argue in this particular case, it wouldn't be unreasonable to do a single .Replace()

Secondly, you could also use System.Uri to format your path, it's very strict. However, this will be more lines than a simple .Replace(). I apperently am voting for you to just use .Replace() be done with it! Hope that helps

Robert Seder
A: 

No, the seperator character is defined as a Read Only.

http://msdn.microsoft.com/en-us/library/system.io.path.pathseparator.aspx

You should use a Replace as it's a trivial change.

Nissan Fan
What are you talking about? Even assuming you mean `DirectorySeparator`, he's trying to change it in his string, not the value used by the system.
Gabe
+3  A: 

Hi Daniel,

Because your "test1/test2" is already a string literal, Path.Combine will not change the '/' for you to a '\'.

Path.Combine will only concat the 2 string literals with the appropriate path delimiter used by the OS, in this case Windows, which is '\', from there your output

test1/test2\test3\test4

Your best bet would be the string.Replace.

Riaan
Thanks. Alternatively, I found out that `Path.GetFullPath()` will also replace slashes with backslashes.
Daniel T.
Cool, I didn't know that, but I will sure make a note of it.
Riaan
A: 

Using .NET Reflector, you can see that Path.Combine doesn't change slashes in the provided strings

public static string Combine(string path1, string path2)
{
    if ((path1 == null) || (path2 == null))
    {
        throw new ArgumentNullException((path1 == null) ? "path1" : "path2");
    }
    CheckInvalidPathChars(path1);
    CheckInvalidPathChars(path2);
    if (path2.Length == 0)
    {
        return path1;
    }
    if (path1.Length == 0)
    {
        return path2;
    }
    if (IsPathRooted(path2))
    {
        return path2;
    }
    char ch = path1[path1.Length - 1];
    if (((ch != DirectorySeparatorChar) && (ch != AltDirectorySeparatorChar)) && (ch != VolumeSeparatorChar))
    {
        return (path1 + DirectorySeparatorChar + path2);
    }
    return (path1 + path2);
}

You can do the same with String.Replace and the Uri class methods to determine which one works best for you.

GaTechThomas
Note that `DirectorySeparatorChar = '\\'` and `AltDirectorySeparatorChar = '/'`
Greg
A: 

As others have said, Path.Combine doesn't change the separator. However if you convert it to a full path:

Path.GetFullPath(Path.Combine("test1/test2", "test3\\test4"))

the resulting fully qualified path will use the standard directory separator (backslash for Windows).

Joe