.NET路径操作库
时间:2020-03-05 18:50:06 来源:igfitidea点击:
有谁知道一个好的库可以很好地抽象出路径操作问题?我希望能够使用任意分隔符(例如'/'或者':')组合和解析路径,而无需重新设计轮子。
可惜的是System.IO.Path没有更多的可重用性。
谢谢
解决方案
回答
System.IO.Path.Combine将非常适合许多不同类型的路径:
http://msdn.microsoft.com/en-us/library/system.io.path.combine.aspx
System.IO.Path.Combine使用当前的平台标准分隔符来组合路径。这意味着在Windows上它使用" ",在unix / linux(单声道)上它使用" /"。我们能否提供一些示例,说明我们要尝试在什么平台上组合哪些路径?
回答
我们正在描述正则表达式!将其用作我们需要做的事情的基础。
回答
检查Patrick的库以处理路径操作链接文本
这是Codeplex项目
回答
我无法根据分隔符说出我们可能正在使用哪种环境,但是我以前从未见过像这样的库。
因此,使用反射器和" System.IO.Path"作为基础,重塑轮子并不困难。
- 创建此类的实例
- 在CTor中提供分隔符
- 如果需要,可以选择更改InvalidPathChars。
这几乎是框架使用的代码,因此应该一样快,或者差异可以忽略不计。可能会或者可能不会比RegEx快,但它可能值得测试。
class ArbitraryPath { private readonly char _directorySeparatorChar; private readonly char _altDirectorySeparatorChar; private readonly char _volumeSeparatorChar; public ArbitraryPath(char directorySeparatorChar, char altDirectorySeparatorChar, char volumeSeparatorChar) { _directorySeparatorChar = directorySeparatorChar; _altDirectorySeparatorChar = altDirectorySeparatorChar; _volumeSeparatorChar = volumeSeparatorChar; } public 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); } public bool IsPathRooted(string path) { if (path != null) { CheckInvalidPathChars(path); int length = path.Length; if (length >= 1 && (path[0] == _directorySeparatorChar || path[0] == _altDirectorySeparatorChar) || length >= 2 && path[1] == _volumeSeparatorChar) { return true; } } return false; } internal static void CheckInvalidPathChars(string path) { for (int i = 0; i < path.Length; i++) { int num2 = path[i]; if (num2 == 0x22 || num2 == 60 || num2 == 0x3e || num2 == 0x7c || num2 < 0x20) { throw new ArgumentException("Argument_InvalidPathChars"); } } } }
回答
恐怕我们必须像我一样自己实现一个路径类。它具有以下优点:
- 我们可以从类型安全中受益
- 我们可以覆盖运算符/,这使连接更容易
- 我们可以添加便捷成员函数,例如GetParentPath()和GetLeafPart()