Я не могу сказать, в какой среде вы могли бы использовать на основе от ваших сепараторов, но я никогда не видел библиотеку, как это до.
Таким образом, использование рефлектора и 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");
}
}
}
}
Я думаю, System.IO.Path отлично работает. У вас есть конкретные задачи, которые вам нужны, с которыми они не справляются? – Espo 2008-09-09 14:53:45
@Espo: попробуйте прочитать второе предложение моего вопроса. – 2009-08-23 14:51:30
Можете ли вы использовать [Path.DirectorySeparatorChar] (http://msdn.microsoft.com/en-us/library/system.io.path.directoryseparatorchar.aspx)? – 2008-09-09 14:57:53