43

I don't quite see the difference.

What could Path.Combine do better than perfectly working string concatenation?

I guess it's doing something very similar in the background.

Can anyone tell me why it is so often preferred?

user990423
  • 1,397
  • 2
  • 12
  • 32
Sossenbinder
  • 4,852
  • 5
  • 35
  • 78
  • 2
    First and biggest benefit of using Path.Combine is that, it will handle the slash issue on its own i.e. you need not to worry about adding '\' or '/' etc. About background process, read [here](https://startbigthinksmall.wordpress.com/2008/05/28/pathcombine-does-more-then-just-putting-a-between-to-strings-use-it/) – PM. Aug 18 '15 at 11:22
  • 5
    Code using `Path.Combine` would work unchanged on Linux & Mac when using mono. – Enigmativity Aug 18 '15 at 11:25

6 Answers6

45

Path.Combine uses the Path.PathSeparator and it checks whether the first path already has a separator at the end so it will not duplicate the separators. Additionally, it checks whether the path elements to combine have invalid chars.

niico
  • 11,206
  • 23
  • 78
  • 161
György Kőszeg
  • 17,093
  • 6
  • 37
  • 65
  • 1
    So in the end it's just an "upgraded" concatenation with extra checks? – Sossenbinder Aug 18 '15 at 11:27
  • 1
    I'm not sure what do you mean "upgraded", but you can simply check the sources here: http://referencesource.microsoft.com/#mscorlib/system/io/path.cs You should always use Combine instead of custom concatenation. – György Kőszeg Aug 18 '15 at 11:31
  • It should be noted that it does some invalid character checking (control codes and | " < > ) but if you have wildcards it lets them through in case it is used for glob matching. – Paul Childs Mar 09 '23 at 22:11
19

Path.Combine does more things than just a string concatenation. If you look at the source code;

  • Checks both paths has invalid character or not
  • Checks second parameter is root path or not
  • Checks last character of first path is director or alt directory or volume separator or not. If not, concatenate both string with directory separator between then
Soner Gönül
  • 97,193
  • 102
  • 206
  • 364
5

Here is the implementation

public static string Combine(string path1, string path2)
{
    if (path1 == null || path2 == null)
    {
        throw new ArgumentNullException((path1 == null) ? "path1" : "path2");
    }
    Path.CheckInvalidPathChars(path1, false);
    Path.CheckInvalidPathChars(path2, false);
    return Path.CombineNoChecks(path1, path2);
}

private static string CombineNoChecks(string path1, string path2)
{
    if (path2.Length == 0)
    {
        return path1;
    }
    if (path1.Length == 0)
    {
        return path2;
    }
    if (Path.IsPathRooted(path2))
    {
        return path2;
    }
    char c = path1[path1.Length - 1];
    if (c != Path.DirectorySeparatorChar && c != Path.AltDirectorySeparatorChar && c != Path.VolumeSeparatorChar)
    {
        return path1 + Path.DirectorySeparatorChar + path2;
    }
    return path1 + path2;
}
Chamika Sandamal
  • 23,565
  • 5
  • 63
  • 86
4

According to this documentation Path.Combine internally performs a string concatenation using +-Operator.

 private static String CombineNoChecks(String path1, String 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 + DirectorySeparatorCharAsString + path2;
        return path1 + path2;
    }
bwegs
  • 3,769
  • 2
  • 30
  • 33
ckruczek
  • 2,361
  • 2
  • 20
  • 23
2

You avoid double path separators. If one path element already has a leading backslash. Path.Combine checks for that and ensures that only one backslash is present.

MBulli
  • 1,659
  • 2
  • 24
  • 36
1

System.IO.Path.Combine() Automatically combines multiple paths to a single string by using the correct path separator i.e. forward slash '/' or backward slash '' compatible to the operating systems OS. On the other hand, using string concatenation will do the same but we will need to explicitly (manually) add correct path separator after or before the paths respectively to the paths. forexample:

   string virtualPath = "/data/directory" +"/" + "video.mp4";

while using Path.Combine(),

string virtualPath = Path.Combine("/data/directory", "video.mp4");

Both the Path.Combine() and string concatenation method produce the same result but Path.Combine() method offers a more elegant method to combine paths.

Shah
  • 11
  • 2