84

将路径与文件名结合起来的最佳方法是什么?

也就是说,给定c:\foobar.txt,我想要c:\foo\bar.txt

给定c:\fooand ..\bar.txt,我想要一个错误或c:\foo\bar.txt(所以我不能Path.Combine()直接使用)。同样对于c:\fooand bar/baz.txt,我想要一个错误 or c:\foo\baz.txt(not c:\foo\bar\baz.txt)。

我意识到,我可以检查文件名是否包含“\”或“/”,但这是否足够?如果不是,正确的检查是什么?

4

3 回答 3

124

如果您希望“坏”文件名生成错误:

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

或者,如果您只想在不引发异常的情况下静默纠正“坏”文件名:

string combined = Path.Combine(dir, Path.GetFileName(fileName));
于 2009-06-26T09:18:12.957 回答
19

你可以使用:

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

或者,跳过 \ (未测试,也许 Path.GetFileName 会自动处理)

Path.Combine(folder, Path.GetFileName(fileName.Replace("/","\\")))
于 2009-06-26T09:13:55.413 回答
3

请注意,当您使用Path.Combine(arg1, arg2)- 如果您的用户为 arg2 输入完全限定的文件路径时,它将忽略 arg1,并使用 arg2 作为路径。

在我看来,微软在那里搞砸了!这可以让你敞开心扉,让用户破解你的整个文件系统。被警告,阅读细则!如果您正在组合路径,请使用:var newPath = path1 + @"\" + path2;更简单且没有意外结果...

于 2015-06-02T19:08:35.573 回答