【问题标题】:How do I get .NET's Path.Combine to convert forward slashes to backslashes?如何让 .NET 的 Path.Combine 将正斜杠转换为反斜杠?
【发布时间】:2010-06-29 20:30:22
【问题描述】:

我正在像这样使用 Path.Combine:

Path.Combine("test1/test2", "test3\\test4");

我得到的输出是:

test1/test2\test3\test4

请注意正斜杠不会转换为反斜杠。我知道我可以用 string.Replace 来改变它,但是有没有更好的方法呢?

【问题讨论】:

  • 反斜杠有问题吗? .NET 和 Windows 文件 API 都接受。
  • @John,是的,有:msdn.microsoft.com/en-us/library/system.io.path.combine.aspx。还是您试图对 C# 和 .NET 之间的区别持迂腐态度?
  • @John:感谢您指出这一点。我应该说 .NET 而不是 C#,但考虑到 99% 的时间我将 C# 与 .NET 一起使用,我认为它们是一回事。
  • @John 我错过了我认为的相关性。我不认为 Path.Combine 是特定于 C# 3.0 的,或者认为问题的范围是 .NET 2.0。否则我会在船上。如果丹尼尔是一个不熟悉差异的初学者,我认为“C#中没有Path.Combine”只会引入更多的混乱,因为这是一个非常不完整的想法,除了说“你错了,我知道一些你不知道的事情,我会提到这一点,但没有详细说明它以帮助启发你或以任何有意义的方式为这次讨论做出贡献。”
  • @John 没问题。很高兴得到赞赏。成长永远不会太晚。

标签: c# .net


【解决方案1】:

正如其他人所说, Path.Combine 不会更改分隔符。 但是,如果您将其转换为完整路径:

Path.GetFullPath(Path.Combine("test1/test2", "test3\\test4"))

生成的完全限定路径将使用标准目录分隔符(Windows 为反斜杠)。

请注意,这适用于 Windows,因为 \ 和 / 都是合法的路径分隔符:

Path.DirectorySeparatorChar = \
Path.AltDirectorySeparatorChar = /

如果您在 Linux 上运行 .NET Core 2.0,则只有正斜杠是合法的路径分隔符:

Path.DirectorySeparatorChar = /
Path.AltDirectorySeparatorChar = /

在这种情况下,它不会将反斜杠转换为正斜杠,因为反斜杠不是合法的备用路径分隔符。

【讨论】:

  • 有效,但要小心,因为 GetFullPath() 会修复相对路径并将其转换为完整路径。如果您需要保留相对路径,GetFullPath() 将不起作用。
  • @George,你确定:mono 在哪个操作系统上?您的单声道 (Path.DirectorySeparatorChar) 版本的标准路径分隔符是什么?
  • @Joe 很遗憾是的。带有 System.IO.Path 版本的 Mac 上的 Mono JIT 编译器版本 5.8.0.108(2017-10/9aa78573ee2 Wed Jan 10 04:30:03 EST 2018):类型:System.IO.Path Version=4.0.0.0,Culture=neutral , PublicKeyToken=b77a5c561934e089
【解决方案2】:

因为您的“test1/test2”已经是字符串文字,Path.Combine 不会将您的“/”更改为“\”。

Path.Combine 只会将 2 个字符串文字与操作系统使用的适当路径分隔符连接起来,在这种情况下是 Windows,即“\”,从那里输出

test1/test2\test3\test4

你最好的选择是 string.Replace。

【讨论】:

  • 谢谢。或者,我发现Path.GetFullPath() 也会用反斜杠替换斜杠。
  • 酷,我不知道,但我一定会记下来的。
  • 合并后,你可以用Path.DirectorySeparatorChar替换所有类型的斜线。
【解决方案3】:

尝试使用Uri 类。它将为正确的目标机器创建有效的 Uris (/ -> \)。

【讨论】:

  • 好吧,这行得通。只需要创建new Uri(path),它就会自动转换为反斜杠。不错
【解决方案4】:

首先,我会在这种特殊情况下争论,做一个 .Replace() 并不是不合理的

其次,你也可以使用 System.Uri 来格式化你的路径,它非常严格。但是,这将比简单的 .Replace() 多行。我显然是在投票支持您使用 .Replace() 来完成它!希望有帮助

【讨论】:

    【解决方案5】:

    尝试使用

    var fullname = new DirectoryInfo(Path.Combine("f:/","test1/test2", "test3\\test4")).FullName;
    

    这将导致

    f:\test1\test2\test3\test4
    

    【讨论】:

      【解决方案6】:

      如果您需要结果包含正斜杠而不是反斜杠,并且如果您的第一个路径组件是绝对(即根)路径,您实际上可以使用 Uri 类来组合它:

      string CombinedPath = new Uri(new Uri("C:/test1/test2"), "test3\\test4").AbsolutePath;
      

      请注意,如果第一个组件也是相对路径,这将不起作用。

      【讨论】:

        【解决方案7】:

        使用 .NET Reflector,您可以看到 Path.Combine 不会更改提供的字符串中的斜杠

        public static string Combine(string path1, string path2)
        {
            if ((path1 == null) || (path2 == null))
            {
                throw new ArgumentNullException((path1 == null) ? "path1" : "path2");
            }
            CheckInvalidPathChars(path1);
            CheckInvalidPathChars(path2);
            if (path2.Length == 0)
            {
                return path1;
            }
            if (path1.Length == 0)
            {
                return path2;
            }
            if (IsPathRooted(path2))
            {
                return path2;
            }
            char ch = path1[path1.Length - 1];
            if (((ch != DirectorySeparatorChar) && (ch != AltDirectorySeparatorChar)) && (ch != VolumeSeparatorChar))
            {
                return (path1 + DirectorySeparatorChar + path2);
            }
            return (path1 + path2);
        }
        

        您可以对 String.Replace 和 Uri 类方法执行相同的操作,以确定哪个最适合您。

        【讨论】:

        • 请注意DirectorySeparatorChar = '\\'AltDirectorySeparatorChar = '/'
        【解决方案8】:

        不,分隔符被定义为只读。

        http://msdn.microsoft.com/en-us/library/system.io.path.pathseparator.aspx

        您应该使用 Replace,因为它是一个微不足道的更改。

        【讨论】:

        • 你在说什么?即使假设您的意思是DirectorySeparator,他也试图在他的字符串中更改它,而不是系统使用的值。
        猜你喜欢
        • 2014-09-28
        • 1970-01-01
        • 2019-11-19
        • 2020-11-10
        • 2016-08-07
        • 2011-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多