【问题标题】:What is the best way to combine a path and a filename in C#/.NET?在 C#/.NET 中组合路径和文件名的最佳方法是什么?
【发布时间】:2010-11-06 02:17:46
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# .net path filenames


    【解决方案1】:

    你可以使用:

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

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

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

    【讨论】:

    • 谢谢!仅供参考:不需要替换。
    【解决方案2】:

    如果你想让“坏”文件名产生错误:

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

    【讨论】:

    • 对于不太熟悉框架的人,您需要在文件中调用using System.IO; 才能访问Path
    • 请注意,如果Path.Combine 的任何一个参数是null,则ArgumentNullException 将抛出一个ArgumentNullException。您可以将空字符串传递给任一参数
    • 注意:如果需要,Path.Combine 通常会在每个路径之间添加一个分隔符。但是,Path.Combine("C:", "file.txt") 返回的 "C:file.txt" 不是有效路径。
    • 请注意,这仍然允许fileName 成为.. 并导致类似C:\path\to\.. 的结果。在这里测试:dotnetfiddle.net/DoeH8K。根据用例,您可能还需要验证 fileName 是一个有效的文件名(而不是像 .. 和可能是 nulcon 的“特殊文件名”...)。
    【解决方案3】:

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

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

    【讨论】:

    • 相对路径组合返回的右侧完整路径是正确有效的结果。
    • 不管结果是否正确和有效,太多的开发人员都忽略了这样一个事实:如果在他们的代码中 arg1 是文件夹路径而 arg2 是用户输入,那么输入的绝对路径 arg2 将是结果输出。在我看来,这太容易打开最糟糕的网络应用程序黑客攻击了..代码/外壳注入...检查您的输入。
    • 在我看来,任何认为允许用户在没有任何检查的情况下输入路径是可以的开发人员都应该被黑。这是第一天的东西,Path.Combine 的设计并非按照您认为的方式工作——它是一种体面且可靠的方式,可以避免检查终端反斜杠,这实际上是供您的代码内部使用的,不是作为保护文件的前端。它的文档非常完整——只需阅读即可。
    猜你喜欢
    • 2011-01-30
    • 2013-06-13
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多