1

.NET (VB または C#) では、ファイル パス文字列から「ヘッド」ディレクトリを削除する簡単な方法を知っている人はいますDirectory1/Directory2/Directory3Directory2/Directory3。それを配列に分割し、2番目の要素から始めてすべてを連結するなど、いくつかの方法があることは知っていますが、それは非常に非効率的な方法であり、これを行うためのより良い方法。

4

4 に答える 4

4

それはあなたが探しているものに依存します。物事が形になっていることがわかっている場合はdir1/dir2/dir3/dir4...、最初のものを探して、その後/すべてを取ることができます。

string dir = "dir1/dir2/dir3";
var pos = dir.IndexOf('/');
if (pos != -1)
{
    result = dir.Substring(pos+1);
}

c:\dir\dir\file.extフォームまたはのフルパス名も受け入れることができる場合は、\\server\dir\dir\file.ext最初に相対パスをフルパスにすることを確認する必要があります。次に、上記のトリックのようなものを使用する前に、クラスのメソッドを使用しSystem.IO.Pathてドライブ名またはサーバー名を抽出します。IndexOf

于 2013-02-12T19:01:28.650 に答える
0

正確さと効率を求めるなら、

string path=@"dir1/dir2/dir3";
path=path.Substring(path.IndexOf(System.IO.Path.DirectorySeparatorChar)+1);

新しい文字列が 1 つだけ作成されます。

于 2013-02-12T19:30:28.047 に答える
0

System.IO.Pathクラスを見てください。この種のものには、多くの便利なメソッドがあります。

たとえば、次GetPathRoot()のように String.Replace() への呼び出しの一部としてそのメソッドを使用できます。

public string RemoveHead(string path)
{
    return path.Replace(Path.GetPathRoot(path), "");
}

私はVisual Studioを手元に持っていないので、区切り文字やドライブ文字を考慮して微調整が必​​要になる可能性がありますが、アイデアが得られるはずです.

于 2013-02-12T18:59:55.163 に答える
0
        /// <summary>
    /// Removes head.
    /// </summary>
    /// <param name="path">The path to drop head.</param>
    /// <param name="retainSeparator">If to retain separator before next folder when deleting head.</param>
    /// <returns>New path.</returns>
    public static string GetPathWithoutHead (string path, bool retainSeparator = false)
    {
        if (path == null) 
        {
            return path;
        }
        if (string.IsNullOrWhiteSpace (path)) 
        {
             throw new ArgumentException(path, "The path is not of a legal form.");
        }

        var root = System.IO.Path.GetPathRoot (path);
        if (!string.IsNullOrEmpty(root) && !StartsWithAny(root,System.IO.Path.DirectorySeparatorChar,System.IO.Path.AltDirectorySeparatorChar))
        {               
            return path.Remove(0,root.Length);
        }

        var sep = path.IndexOf(System.IO.Path.DirectorySeparatorChar);
        var altSep = path.IndexOf(System.IO.Path.AltDirectorySeparatorChar);
        var pos = MaxPositiveOrMinusOne (sep, altSep);
        if (pos == -1)
        {
            return string.Empty;
        }

        if (pos == 0) 
        {
            return GetPathWithoutHead(path.Substring(pos+1), retainSeparator);
        }

        var eatSeparator = !retainSeparator ? 1 : 0;
        return path.Substring(pos+eatSeparator);
    }

    /// <summary>
    /// Startses the with.
    /// </summary>
    /// <returns><c>true</c>, if with was startsed, <c>false</c> otherwise.</returns>
    /// <param name="val">Value.</param>
    /// <param name="maxLength">Max length.</param>
    /// <param name="chars">Chars.</param>
    private static bool StartsWithAny(string value, params char[] chars)
    {
        foreach (var c in chars) 
        {
            if (value[0] == c) 
            {
                return true;
            }
        }
        return false;
    }

    /// <summary>
    /// Maxs the positive or minus one.
    /// </summary>
    /// <returns>The positive or minus one.</returns>
    /// <param name="val1">Val1.</param>
    /// <param name="val2">Val2.</param>
    private static int MaxPositiveOrMinusOne(int val1, int val2)
    {
        if (val1 < 0 && val2 < 0)
        {
            return -1;
        }
        return Math.Max(val1,val2: val2);
    }

いくつかの単体テストはこちら

于 2015-10-09T07:50:24.117 に答える