Кто-нибудь знает какую-нибудь хорошую библиотеку, которая хорошо абстрагирует проблему манипулирования путями? Я хотел бы иметь возможность комбинировать и анализировать пути с произвольными разделителями (например, '/' или ':'), не изобретая колесо.
Жалко, что System.IO.Path больше не пригоден для повторного использования.
Спасибо
@Espo: попробуйте прочитать второе предложение моего вопроса.
Вы можете использовать Path.DirectorySeparatorChar?





System.IO.Path.Combine отлично подходит для многих разных типов путей:
http://msdn.microsoft.com/en-us/library/system.io.path.combine.aspx
System.IO.Path.Combine использует стандартные разделители текущей платформы для объединения путей. Это означает, что в Windows он использует «\», а в unix / linux (моно) он использует «/». Можете ли вы привести примеры того, какие пути вы пытаетесь объединить и на какой платформе?
Боюсь, что System.IO.Path не поможет, потому что символы-разделители, которые он использует и понимает, предопределены. Как я уже сказал, мне нужно использовать произвольные символы-разделители, такие как «:» и «/». Лучшее, что я могу сделать с System.IO.Path, - это преобразовать мои произвольные символы в те, которые он распознает (например, '\'), а затем снова преобразовать их обратно. Но это в лучшем случае хакерское решение.
Вы описываете регулярные выражения! Используйте это как основу для того, что вам нужно делать.
Конечно, регулярные выражения будут работать, и это то, что я использовал до сих пор. Но они кажутся излишними и вряд ли будут работать так же хорошо, как специальная библиотека для управления путями. В конце концов, System.IO.Path не использует регулярное выражение в своей реализации, не так ли?
Проверьте библиотеку Патрика для обработки операций с путями текст ссылки
Это проект codeplex
Спасибо - эта библиотека выглядит полезной, но по-прежнему не позволяет указать собственный разделитель путей. Он просто использует Path.DirectorySeparatorChar.
Я не могу сказать, какую среду вы можете использовать, основываясь на ваших разделителях, но я никогда раньше не видел такой библиотеки.
Так что, взяв за основу отражатель и System.IO.Path, изобрести велосипед несложно.
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");
}
}
}
}
Боюсь вам придется реализовать класс пути самостоятельно, как и я. Это дает следующие преимущества:
Я думаю, что System.IO.Path отлично работает. У вас есть конкретные задачи, с которыми он не может справиться?