是否可以使用System.IO.Path类或某些类似对象来格式化unix样式路径,提供与PATH类类似的功能?例如,我可以这样做:
Console.WriteLine(Path.Combine("c:\\", "windows"));
显示:
"C:\\windows"
但是我尝试使用正斜杠(/)尝试类似的东西,它只是为我反转它们。
Console.WriteLine(Path.Combine("/server", "mydir"));
显示:
"/server\\mydir"
答案 0 :(得分:3)
在这种情况下,我会使用课程System.Uri或System.UriBuilder。
旁注:如果您在具有Mono-Runtime的Linux系统上运行.NET代码,则Path类应返回您预期的行为。 Path类使用的信息由底层系统提供。
答案 1 :(得分:3)
你遇到了更大的问题,Unix接受文件名中的字符而不是Windows不允许的字符。此代码将使用ArgumentException“路径中的非法字符”进行轰炸:
string path = Path.Combine("/server", "accts|payable");
对于Unix路径,您无法可靠地使用Path.Combine()。
答案 2 :(得分:3)
Path.Combine
使用Path.DirectorySeperatorChar
和Path.VolumeSeparatorChar
的值,这些值由运行时中的类库确定 - 因此,如果您仅使用Path.Combine
次调用编写代码,Environment.SpecialFolder
值,等等,它将在任何地方运行良好,因为Mono(可能是任何.NET运行时)实现了为其运行的任何平台获取和构建这些路径的本机方式。 (例如,你的第二个例子为我返回/server/mydir
,但第一个例子给出了c:\/windows
)
如果您希望在所有情况下对特定于UNIX的路径进行硬编码,Path.Combine
并未向您购买任何内容:Console.WriteLine ("/server/mydir");
在OP中执行您想要的操作。
正如汉斯所说,不同的文件系统对允许的字符,路径长度等有不同的规则,因此最好的做法,就像任何跨平台编程一样,是限制自己使用两者之间的允许功能的交集。您要定位的文件系统。观察案例敏感性问题。