在C#中通过“\\”分割路径

5

我该如何用"\\"拆分路径?如果我使用"\",它会给我一个语法错误。

path.split("\\");
8个回答

36

你应该使用

path.Split(Path.DirectorySeparatorChar);

如果你想根据本地路径分隔符来分割文件路径。


4
好的,那取决于情况。可能适合 - 也可能不适合。当然,只有在非Windows上运行Mono时才会有所不同......此时您仍需要知道输入实际上是主机操作系统的路径,还是来自HTTP上传的文件名等其他内容。 - Jon Skeet
此外,还有许多方便的方法,如Path.GetFileName()、Path.GetFileNameWithExtensions()等。 - st78
@Jon: 那并不完全正确...请考虑到不同语言版本的Windows使用不同的字符作为路径分隔符。例如,在韩文版的Windows中会使用韩元符号,而在日文版中会使用日元符号。因此,尽管这两个符号碰巧是相同的Unicode字符,你可能永远都不应该硬编码反斜杠作为路径分隔符,即使你针对Windows操作系统。 - Cody Gray
@Cody:这与DirectorySeparatorChar的文档相符吗?“此字段的值在UNIX上为斜杠(“/”),在Windows和Macintosh操作系统上为反斜杠(“\”)。”(看起来这也是正确的。) - Jon Skeet
1
@Jon:老实说,我不确定。这可能取决于它们的代码页值是否相等,因此在相关版本的Windows中,反斜杠(反向实心斜杠)只显示为Won或Yen。你也可以用你的软件做同样的事情。但是当有更好的解决方案时,我通常不喜欢硬编码信息。这也可能是文档中的错误。这不是我们第一次看到这种情况了。我还没有检查过.NET源代码的非英语版本。 - Cody Gray
1
@Cody Gray,对于韩语和日语,路径分隔符是\\,只是可视化表示不同。当默认系统区域设置为日语或韩语时,系统将显示U+005C代码点的Yen或Won符号。很糟糕,但这是事实。 - Chris Taylor

8
尝试使用 path.Split('\\'),这样单引号(用于字符)就可以正常工作了。
要使用字符串,请按照以下方式操作:
path.Split(new[] {"\\"}, StringSplitOptions.None)

要使用字符串,您需要指定一个字符串数组。我从来没有明白为什么要这样做 :)

7

没有接受字符串参数的 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 上的方法以更加文件系统敏感的方式获取有关路径的信息。

7

为了保险起见,您可以使用以下方法:

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

1
在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可能更安全。

0
Path.Split(new char[] { '\\\' });

0
最好使用现有的 System.IO.Path 类,这样您就不需要关心任何系统规范。
它提供了访问文件路径的任何部分的方法,例如 GetFileName(string path) 等。

-1
一个完整的解决方案可能是这样的:
//
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。查看生成的汇编代码时,您会发现每个“new”语句都会调用“CORINFO_HELP_NEWARR_1_VC”,即使在发布模式下也是如此。这是因为数组不是不可变的,所以无论何时都会创建新的数组。我的解决方案是通过将数组声明为只读和静态来防止这种情况发生。 3. 内联语法的可重用性也较差,因为您可能想在其他上下文中使用路径分隔符数组。 4. 应该使用StringSplitOptions.RemoveEmptyEntries来处理UNC路径和传入路径中可能存在的拼写错误。操作系统不允许重复的路径分隔符,但用户可能会出现打字错误或重复连接路径分隔符字符的情况,例如在连接路径和文件名时。

SplitPath本身是不够的;在使用它之前,您还必须检查路径是否为UNC格式。 - cskwg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接