パス操作の問題を良い方法で抽象化する優れたライブラリを知っている人はいますか? 車輪を再発明することなく、パスを任意の区切り文字 (「/」または「:」など) と組み合わせて解析できるようにしたいと考えています。
System.IO.Path
これ以上再利用できないのは残念です。
ありがとう
パトリックのライブラリをチェックして、パス操作のリンク テキストを処理する
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
ベースとして使用すると、車輪を再発明することは難しくありません。
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");
}
}
}
}