2009-06-26 223 views
49

将路径与文件名合并的最佳方式是什么?我想要c:\foo\bar.txt在C#/ .NET中合并路径和文件名的最佳方式是什么?

鉴于c:\foo..\bar.txt,我想有错误或者c:\foo\bar.txt(所以我不能使用Path.Combine()直接)。同样,对于c:\foobar/baz.txt,我想要一个错误或c:\foo\baz.txt(而不是c:\foo\bar\baz.txt)。

我意识到,我可以检查文件名不包含'\'或'/',但是这足够吗?如果不是,那么正确的支票是什么?

回答

83

如果你想 “坏” 的文件名生成一个错误:

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

或者,如果你只是想静静地纠正“坏”文件名而不抛出前ception:

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

对于那些不太熟悉框架的人,您需要在文件中使用“System.IO”调用来访问“Path”。 – 2012-09-07 13:41:47

+2

请注意,如果Path.Combine中的任何一个参数都为null,它将抛出一个`ArgumentNullException`。您**可以**将空字符串传递给参数 – 2013-03-01 23:23:19

16

你可以使用:

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

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

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

谢谢!只是供参考:替换是没有必要的。 – 2009-06-26 10:01:24

1

要知道,当你使用Path.Combine(arg1, arg2) - 如果您的用户对ARG2输入一个完全合格的文件路径,它将不顾ARG1,并使用ARG2为路径。

在我看来,微软搞砸了!这可能会让用户在整个文件系统中进行黑客攻击。被警告,请仔细阅读!如果你合并路径使用:var newPath = path1 + @"\" + path2;更简单,没有意外的结果...

相关问题