views:

894

answers:

2

What is the best way to combine a path with a filename?

That is, given "c:\foo" and "bar.txt", I want "c:\foo\bar.txt".

Given "c:\foo" and "..\bar.txt", I want either an error or "c:\foo\bar.txt" (so I cannot use Path.Combine() directly). Similarly for 'c:\foo" and "bar/baz.txt", I want an error or "c:\foo\baz.txt" (not "c:\foo\bar\baz.txt").

I realize, I could check that the filename does not contain '\' or '/', but is that enough? If not, what is the correct check?

+7  A: 

You could use:

Path.Combine(folder, Path.GetFileName(fileName))

or, to skip out the \ (not tested, maybe the Path.GetFileName handles this automatically)

Path.Combine(folder, Path.GetFileName(fileName.Replace("/","\\")))
GvS
Thanks! Just FYI: the Replace is not necessary.
Rasmus Faber
+9  A: 

If you want "bad" filenames to generate an error:

if (Path.GetFileName(fileName) != fileName)
{
    throw new Exception("'fileName' is invalid!");
}
string combined = Path.Combine(dir, fileName);

Or, if you just want to silently correct "bad" filenames without throwing an exception:

string combined = Path.Combine(dir, Path.GetFileName(fileName));
LukeH