Библиотека манипулирования путями .NET - PullRequest
4 голосов
/ 09 сентября 2008

Кто-нибудь знает какую-нибудь хорошую библиотеку, которая хорошо описывает проблему манипулирования путями? Я хотел бы иметь возможность комбинировать и анализировать пути с произвольными разделителями (например, '/' или ':'), не изобретая колесо заново.

Обидно, что System.IO.Path больше не подходит для повторного использования.

Спасибо

Ответы [ 5 ]

1 голос
/ 11 сентября 2008

Проверка библиотеки Патрика для обработки операций с путями текст ссылки

Это проект codeplex

1 голос
/ 09 сентября 2008

System.IO.Path.Combine отлично подойдет для многих различных типов путей:

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

System.IO.Path.Combine использует стандартные разделители текущей платформы для объединения путей. Это означает, что в Windows он использует «\», а в unix / linux (mono) - «/». Можете ли вы привести примеры того, какие пути вы пытаетесь объединить и на какой платформе?

0 голосов
/ 09 сентября 2010

Боюсь, вам придется реализовать класс пути самостоятельно , как я это сделал. Это дает следующие преимущества:

  • Вы можете получить прибыль от безопасности типа
  • вы можете переопределить оператор /, что упрощает объединение
  • Вы можете добавить удобные функции-члены, такие как GetParentPath () и GetLeafPart ()
0 голосов
/ 28 октября 2009

Я не могу сказать, какую среду вы можете использовать, основываясь на ваших разделителях, но я никогда не видел подобной библиотеки.

Таким образом, используя отражатель и 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 голосов
/ 09 сентября 2008

Вы описываете регулярные выражения! Используйте это в качестве основы для того, что вам нужно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...