C# 如何在路径的给定部分下查找文件夹?

C# 如何在路径的给定部分下查找文件夹?,c#,.net,directory-traversal,C#,.net,Directory Traversal,给定路径和某个分区,如何在该分区的正下方找到文件夹的名称 这很难解释,让我举几个例子。假设我正在“Dev/branchs”下面查找文件夹的名称。以下是输入示例,预期结果以粗体显示 C:\Code\Dev\branchs\最新版本\bin\abc.dll C:\Dev\branchs\5.1 D:\My Documents\Branchs\7.0\Source\Tests\test.cs 我用的是C# 编辑:我想我可以使用regex/Dev/branchs/(.*)/捕获第一个组,但是没有re

给定路径和某个分区,如何在该分区的正下方找到文件夹的名称

这很难解释,让我举几个例子。假设我正在“Dev/branchs”下面查找文件夹的名称。以下是输入示例,预期结果以粗体显示

  • C:\Code\Dev\branchs\最新版本\bin\abc.dll
  • C:\Dev\branchs\5.1
  • D:\My Documents\Branchs\7.0\Source\Tests\test.cs
我用的是C#


编辑:我想我可以使用regex
/Dev/branchs/(.*)/
捕获第一个组,但是没有regex还有更整洁的解决方案吗?无论如何,在第二种情况下,正则表达式将失败。

将其分解为更小的步骤,您可以自己解决这个问题:

  • (可选,取决于进一步的要求):获取目录名(文件不相关):
  • 获取其父目录
  • 这可以归结为:

     var directory = Path.GetDirectoryName(input);
     var parentDirectory = Directory.GetParent(directory);
    

    提供的
    C:\Dev\branchs\5.1
    ->
    5.1
    不符合您的规范,即输入路径本身的目录名。这将输出
    分支

    以下是完全符合您期望的代码:

    new Regex("\\?" + PathToMatchEscaped + "\\(\w+)\\?").Match()...
    
    public static string GetSubdirectoryFromPath(string path, string parentDirectory, bool ignoreCase = true)
    {
        // 1. Standarize the path separators.
        string safePath = path.Replace("/", @"\");
        string safeParentDirectory = parentDirectory.Replace("/", @"\").TrimEnd('\\');
    
        // 2. Prepare parentDirectory to use in Regex.
        string directory = Regex.Escape(safeParentDirectory);
    
        // 3. Find the immediate subdirectory to parentDirectory.
        Regex match = new Regex(@"(?:|.+)" + directory + @"\\([^\\]+)(?:|.+)", ignoreCase ? RegexOptions.IgnoreCase : RegexOptions.None);
    
        // 4. Return the match. If not found, it returns null.
        string subDirectory = match.Match(safePath).Groups[1].ToString();
        return subDirectory == "" ? null : subDirectory;
    }
    
    测试代码:

    void Test()
    {
        string path1 = @"C:\Code\Dev\Branches\Latest\bin\abc.dll";
        string path2 = @"C:\Dev\Branches\5.1";
        string path3 = @"D:\My Documents\Branches\7.0\Source\test.cs";
    
        Console.WriteLine("Matches:");
        Console.WriteLine(GetSubdirectoryFromPath(path1, "dev/branches/") ?? "Not found");
        Console.WriteLine(GetSubdirectoryFromPath(path1, @"Dev\Branches") ?? "Not found");
        Console.WriteLine(GetSubdirectoryFromPath(path3, "D:/My Documents/Branches") ?? "Not found");
        // Incorrect parent directory.
        Console.WriteLine(GetSubdirectoryFromPath(path2, "My Documents") ?? "Not found");
        // Case sensitive checks.
        Console.WriteLine(GetSubdirectoryFromPath(path3, @"My Documents\Branches", false) ?? "Not found");
        Console.WriteLine(GetSubdirectoryFromPath(path3, @"my Documents\Branches", false) ?? "Not found");
    
        // Output:
        //
        // Matches:
        // Latest
        // Latest
        // 7.0
        // Not found
        // 7.0
        // Not found
    }
    
    我同意这个

    public static string GetBranchName(string path, string prefix)
    {
        string folder = Path.GetDirectoryName(path);
    
        // Walk up the path until it ends with Dev\Branches
        while (!String.IsNullOrEmpty(folder) && folder.Contains(prefix))
        {
            string parent = Path.GetDirectoryName(folder);
            if (parent != null && parent.EndsWith(prefix))
                return Path.GetFileName(folder);
    
            folder = parent;
        }
    
        return null;
    }
    

    你必须做出两个假设中的一个。在分支的正下方只有一个文件夹,或者您要按字母顺序抓取第一个文件夹。这真的是你要找的吗?@MichaelPerrenoud我相信OP的意思是给定路径中的下一个部分你不想使用字符串查找函数在两个斜杠之间定位字符串?是的,正如@defaultlocale所说。我不在乎磁盘上到底有什么。
    public static string GetBranchName(string path, string prefix)
    {
        string folder = Path.GetDirectoryName(path);
    
        // Walk up the path until it ends with Dev\Branches
        while (!String.IsNullOrEmpty(folder) && folder.Contains(prefix))
        {
            string parent = Path.GetDirectoryName(folder);
            if (parent != null && parent.EndsWith(prefix))
                return Path.GetFileName(folder);
    
            folder = parent;
        }
    
        return null;
    }