在C#/。NET中结合路径和文件名的最佳方法是什么?


73

结合路径和文件名的最佳方法是什么?

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

给定c:\foo..\bar.txt,我想要一个错误或c:\foo\bar.txt(所以我不能Path.Combine()直接使用)。与c:\foo和类似bar/baz.txt,我想要一个错误或c:\foo\baz.txt(不是c:\foo\bar\baz.txt)。

我知道,我可以检查文件名是否不包含“ \”或“ /”,但这足够吗?如果没有,正确的检查方法是什么?

Answers:


112

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

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));

15
对于不太熟悉该框架的用户,您需要using System.IO;在文件中进行调用以访问Path
罗伯特·高兰

3
请注意,如果其中一个参数为,Path.Combine将抛出。您可以将空字符串传递给任何一个参数ArgumentNullExceptionnull
Aaron Blenkush 2013年

4
注意:如果需要,Path.Combine通常会在每个路径之间添加一个分隔符。但是,Path.Combine(“ C:”,“ file.txt”),返回“ C:file.txt”,这不是有效路径。
ConditionRacer

18

您可以使用:

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

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

Path.Combine(folder, Path.GetFileName(fileName.Replace("/","\\")))

5
谢谢!仅供参考:无需更换。
Rasmus Faber

2

请注意,在使用时Path.Combine(arg1, arg2)-如果用户输入arg2的标准文件路径,它将忽略arg1并将arg2用作路径。

在我看来,微软搞砸了!这可以让用户对整个文件系统进行黑客攻击时大开眼界。警告,请阅读细则!如果您要合并路径,请使用:var newPath = path1 + @"\" + path2;更简单且没有意外结果...


合并相对路径后返回的右侧完整路径是正确有效的结果。
马修·怀特

1
不管结果是否正确和有效,太多的开发人员都缺少以下事实:如果在他们的代码中arg1是文件夹路径而arg2是用户输入,则输入的绝对路径arg2将是结果输出。在我看来,这很容易导致最糟糕的Web应用程序黑客攻击..代码/外壳注入...请检查您的输入人员。
Cyassin

1
在我看来,任何认为允许用户无需检查就输入路径的开发人员都应被黑客入侵。这是第一天的工作,而Path.Combine并不是按照您认为的方式工作的,它是一种体面而强大的方法,可以避免检查终端反斜杠,该反斜杠实际上是供代码内部使用的,不作为保护文件安全的前端。它的文档非常完整-请阅读。
jinzai
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.