【问题标题】:Split path by "\\" in C#在 C# 中用“\\”分割路径
【发布时间】:2011-06-25 11:35:49
【问题描述】:

如何通过"\\" 分割路径?如果我使用它会给我一个语法错误

path.split("\\");

【问题讨论】:

    标签: c# split


    【解决方案1】:

    你应该使用

    path.Split(Path.DirectorySeparatorChar);
    

    如果您尝试根据本机路径分隔符拆分文件路径。

    【讨论】:

    • 嗯,这取决于。它可能是合适的——它可能不是。当然,如果在非 Windows 上的 Mono 上运行它只会有所不同...此时您仍然需要知道输入是否实际上是主机操作系统的路径,或者是否是(比如说)来自 HTTP 上传的文件名。
    • 另外,还有很多方便的方法,例如 Path.GetFileName()、Path.GetFileNameWithExtensions() 等
    • @Jon:这并不完全正确......考虑到不同语言版本的 Windows 使用不同的字符作为路径分隔符。例如,在韩文版本的 Windows 上,the Won sign is used,在日文版本上,the Yen sign is used。因此,忽略这些恰好是同一个 Unicode 字符的事实,您可能永远不应该将反斜杠硬编码为路径分隔符,即使您要针对 Windows。
    • @Jon:老实说,我不确定。它可能依赖于它们的代码页值是等效的这一事实,因此反斜杠(反斜线)在相关版本的 Windows 中仅显示为 Won 或 Yen。我想你可以用你的软件做同样的事情。但是当有可能更好的解决方案时,我通常不喜欢硬编码信息。这也可能是文档中的错误。这不是我们第一次看到这种情况。我实际上还没有检查过 .NET 源代码的英文版本。
    • @Cody Gray,对于韩语和日语,路径分隔符都是一个 `\`,它只是改变了视觉表示。当默认系统区域设置为日语或韩语时,系统将显示 U+005C 代码点的日元或韩元符号。可怕,但真实。
    【解决方案2】:

    试试path.Split('\\') --- 所以单引号(用于字符)

    要使用这样的字符串:

    path.Split(new[] {"\\"}, StringSplitOptions.None)
    

    要使用字符串,您必须指定一个字符串数组。我从来不明白为什么:)

    【讨论】:

      【解决方案3】:

      没有采用字符串的string.Split 重载。 (此外,C# 区分大小写,因此您需要 Split 而不是 split)。但是,您可以使用:

      string bits = path.Split('\\');
      

      这将使用带有params char[] 参数的重载。相当于:

      string bits = path.Split(new char[] { '\\' });
      

      假设你肯定想用反斜杠分割。您可能希望按您正在运行的操作系统的目录分隔符进行拆分,在这种情况下,Path.DirectorySeparatorChar 可能是正确的方法......它将是 Unix 上的 /\ 在 Windows 上。另一方面,如果您试图解析在 Unix 上运行的 ASP.NET 页面中的 Windows 文件系统路径,那将无济于事。换句话说,这取决于您的上下文:)

      另一种选择是使用PathDirectoryInfo 上的方法以对文件系统更敏感的方式获取有关路径的信息。

      【讨论】:

        【解决方案4】:

        为了安全起见,您可以使用:

        path.Split(new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar });
        

        【讨论】:

          【解决方案5】:

          在 Windows 上,在 C# Path 函数和命令行中,至少在 Windows 7/XP 中也接受使用正斜杠。

          例如: 这两个对我产生相同的结果:

          dir "C:/Python33/Lib/xml"
          dir "C:\Python33\Lib\xml"
          (In C:)
          dir "Python33/Lib/xml"
          dir "Python33\Lib\xml"
          

          在 Windows 上,'/' 或 '\' 都不是文件名的有效字符。在 Linux 上,文件名中的 '\' 是可以的,因此如果同时解析两者,您应该注意这一点。

          因此,如果您想支持两种形式的路径(就像我一样),您可以这样做:

          path.Split(new char[] {'/', '\\'});
          

          在 Linux 上,使用 Path.DirectorySeparatorChar 可能更安全。

          【讨论】:

            【解决方案6】:
            Path.Split(new char[] { '\\\' });
            

            【讨论】:

              【解决方案7】:

              一个完整的解决方案可能如下所示:

              //
              private static readonly char[] pathSeps = new char[] {
                  Path.DirectorySeparatorChar,
                  Path.AltDirectorySeparatorChar,
                  Path.VolumeSeparatorChar,
              };
              //
              ///<summary>Split a path according to the file system rules.</summary>
              public static string[] SplitPath( string path ) {
                  if ( null == path ) return null;
                  return path.Split( pathSeps, StringSplitOptions.RemoveEmptyEntries );
              }
              

              本文中提出的其他一些解决方案使用以下语法: path.Split(new char[] {'/', '\'});

              虽然这可行,但它有各种缺点:

              1. 它不允许您的应用程序适应各种目标平台。目前,我们的应用程序基本上运行在 UNIX 和 Windows 操作系统(Win、macOS、iOS、linux 变体)上。所以有一组固定的路径字符。但是当 dotNET 被移植到其他操作系统时,这可能会改变。所以最好使用预定义的常量。
              2. 内联语法的性能更差。对于少数文件,这可能不感兴趣,但在处理数百万个文件时,会有明显的差异。托管内存将上升到下一次 GC。查看生成的汇编代码时,您会发现每个“新”语句的“调用 CORINFO_HELP_NEWARR_1_VC”,即使在发布模式下也是如此。每当您新建任何数组时都会发生这种情况,因为数组不是不可变的。我提出的解决方案通过将数组声明为只读和静态来防止这种情况发生。
              3. 内联语法的可重用性也更差,因为您可能希望在其他上下文中使用路径分隔符数组。
              4. StringSplitOptions.RemoveEmptyEntries 应用于说明 UNC 路径和传入路径中可能的拼写错误。操作系统不允许使用重复的路径分隔符,但可能存在用户拼写错误或路径分隔符重复串联的情况,例如在串联路径和文件名时。

              【讨论】:

              • SplitPath 本身是不够的;在使用它之前,您还必须检查路径是否为 UNC 格式。
              猜你喜欢
              • 2016-06-02
              • 1970-01-01
              • 2017-10-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-09-11
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多