2013-02-28 74 views
0

给定一个路径和某个部分,我如何才能找到该部分下面的文件夹的名称?如何在路径的给定部分下找到文件夹?

这很难解释,让我举一些例子。假设我正在查找'Dev/Branches'下的文件夹名称。下面是例子投入,用粗体

  • C中的预计业绩:\代码\开发\分行\ 最新 \ BIN \ abc.dll
  • C:\开发\分行\ 5.1
  • d:\我的文档

我正在使用C#\分行\ 7.0 \来源\测试\ test.cs中

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

+0

你去将不得不m做出两个假设之一。 “Branches”下方只有一个文件夹,或者您将按字母顺序抓取第一个文件夹。这真的是你想要的吗? – 2013-02-28 12:48:35

+1

@MichaelPerrenoud我相信OP意味着给定路径中的下一部分 – 2013-02-28 12:49:34

+1

您不希望使用字符串查找函数来定位两个斜线之间的字符串吗? – roymustang86 2013-02-28 12:49:37

回答

0

我这个

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; 
} 
0

把它分解成更小的步骤,就可以解决这个自己:

  1. (可选,取决于进一步的要求):获取目录名(文件是无关紧要的):Path.GetDirectoryName(string)
  2. 获取它的父目录Directory.GetParent(string)

这归结为;

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

提供的C:\Dev\Branches\5.1 - >5.1不符合您的规格,也就是输入路径本身的目录名。这将输出Branches

0
new Regex("\\?" + PathToMatchEscaped + "\\(\w+)\\?").Match()... 
1
// starting path 
string path = @"C:\Code\Dev\Branches\Latest\bin\abc.dll"; 

// search path 
string search = @"Dev\Branches"; 

// find the index of the search criteria 
int idx = path.IndexOf(search); 

// determine whether to exit or not 
if (idx == -1 || idx + search.Length >= path.Length) return; 

// get the substring AFTER the search criteria, split it and take the first item 
string found = path.Substring(idx + search.Length).Split("\\".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).First(); 

Console.WriteLine(found); 
1

这里是一个会做完全相同的代码,你期待什么:

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 
} 
相关问题