4

パス操作の問題を良い方法で抽象化する優れたライブラリを知っている人はいますか? 車輪を再発明することなく、パスを任意の区切り文字 (「/」または「:」など) と組み合わせて解析できるようにしたいと考えています。

System.IO.Pathこれ以上再利用できないのは残念です。

ありがとう

4

5 に答える 5

1

パトリックのライブラリをチェックして、パス操作のリンク テキストを処理する

これはcodeplex プロジェクトです

于 2008-09-10T20:54:56.327 に答える
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 に答える
0

私と同じように、パスクラスを自分で実装する必要があるのではないかと思います。次の利点があります。

  • 型安全性から利益を得ることができます
  • 連結を容易にするoperator/をオーバーライドできます
  • GetParentPath()やGetLeafPart()などの便利なメンバー関数を追加できます
于 2010-09-09T14:17:25.363 に答える
0

あなたは正規表現を説明しています!あなたがする必要があることの土台としてそれを使用してください。

于 2008-09-09T15:11:19.250 に答える
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 に答える