.NET路径操作库

3

有没有好的库能够以简便的方式抽象路径操作问题?我希望能够组合和解析带有任意分隔符(例如'/'或':')的路径,而不必重新发明轮子。

很遗憾System.IO.Path不能更多地重复使用。

谢谢


我认为System.IO.Path非常好用。你有特定的任务需要它无法处理吗? - Espo
你可以使用 Path.DirectorySeparatorChar 吗? - Ian Oxley
@Espo:尝试阅读我问题的第二句话。 - Kent Boogaart
5个回答

1
System.IO.Path.Combine对于许多不同类型的路径都非常有效。

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

System.IO.Path.Combine 使用当前平台的标准分隔符来组合路径。这意味着在 Windows 上它使用 "\",而在 Unix/Linux (Mono) 上它使用 "/". 你能否提供一些你要组合的路径示例以及所在的平台?


担心System.IO.Path无法帮助,因为它使用和理解的分隔符字符是预定义的。正如我所说,我需要使用任意的分隔符字符,比如':'和'/'。在System.IO.Path中,我能做的最好的办法是将我的任意字符转换为它识别的字符(比如''),然后再进行反向转换。但这只是一个权宜之计,并不是最佳解决方案。 - Kent Boogaart

1

谢谢 - 那个库看起来很有用,但它仍然不允许指定自定义路径分隔符。它只使用Path.DirectorySeparatorChar。 - Kent Boogaart

0

根据你的分隔符,我无法确定你使用的环境,但我以前从未见过这样的库。

因此,使用反射器和 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");
            }
        }
    } 

}

0

恐怕你需要自己实现一个路径类, 就像我一样。这样做有以下优点:

  • 您可以从类型安全中受益
  • 您可以重载operator/,使连接更容易
  • 您可以添加方便的成员函数,例如GetParentPath()和GetLeafPart()

0
你在描述正则表达式!将其作为你需要做的基础。

当然,正则表达式可以工作,这也是我到目前为止使用的方法。但它们似乎过于复杂,并且不太可能像专门的路径操作库那样执行得好。毕竟,System.IO.Path在其实现中并没有使用正则表达式,对吧? - Kent Boogaart

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