4

有谁知道以一种很好的方式抽象路径操作问题的任何好的库?我希望能够使用任意分隔符(例如“/”或“:”)组合和解析路径,而无需重新发明轮子。

遗憾的System.IO.Path是不能更可重用。

谢谢

4

5 回答 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) 上它使用“/”。您能否提供一些示例,说明您正在尝试组合哪些路径以及在什么平台上?

于 2008-09-09T14:52:00.403 回答
1

检查 Patrick 的库以处理路径操作链接文本

这是codeplex 项目

于 2008-09-10T20:54:56.327 回答
0

你在描述正则表达式!用它作为你需要做的事情的基础。

于 2008-09-09T15:11:19.250 回答
0

恐怕您必须像我一样自己实现路径类。它具有以下优点:

  • 你可以从类型安全中获益
  • 您可以覆盖 operator/,这使得连接更容易
  • 您可以添加便捷的成员函数,例如 GetParentPath() 和 GetLeafPart()
于 2010-09-09T14:17:25.363 回答
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");
            }
        }
    } 

}
于 2009-10-28T14:52:39.873 回答