如何从path中提取每个文件夹的名称?

我的path是\\server\folderName1\another name\something\another folder\

如果我不知道path中有多less个文件夹,并且我不知道文件夹名称,如何将每个文件夹名称提取为一个string?

非常感谢

 string mypath = @"..\folder1\folder2\folder2"; string[] directories = mypath.Split(Path.DirectorySeparatorChar); 

编辑:这将返回目录数组中的每个单独的文件夹。 你可以得到像这样返回的文件夹数量:

 int folderCount = directories.Length; 

一般情况下这是很好的:

 yourPath.Split(@"\/", StringSplitOptions.RemoveEmptyEntries) 

如果path本身以(后退)斜杠结尾(例如“\ foo \ bar \”),返回数组中没有空元素。 但是,您必须确保yourPath是一个真正的目录而不是文件。 你可以找出它是什么,并补偿它是否是这样的文件:

 if(Directory.Exists(yourPath)) { var entries = yourPath.Split(@"\/", StringSplitOptions.RemoveEmptyEntries); } else if(File.Exists(yourPath)) { var entries = Path.GetDirectoryName(yourPath).Split( @"\/", StringSplitOptions.RemoveEmptyEntries); } else { // error handling } 

我相信这涵盖了所有的基础,而不是太迂腐。 它会返回一个string[] ,你可以使用foreach来遍历每个目录。

如果你想使用常量而不是@"\/"魔术string,你需要使用

 var separators = new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }; 

然后在上面的代码中使用separators而不是@"\/" 。 就我个人而言,我觉得这太冗长了,很可能不会这样做。

意识到这是一个旧的post,但我碰到它看 – 最后我决定下面的函数,因为它sorting我在当时正在做的比以上任何更好:

 private static List<DirectoryInfo> SplitDirectory(DirectoryInfo parent) { if (parent == null) return null; var rtn = new List<DirectoryInfo>(); var di = parent; while (di.Name != di.Root.Name) { rtn.Add(new DirectoryInfo(di)); di = di.Parent; } rtn.Add(new DirectoryInfo(di.Root)); rtn.Reverse(); return rtn; } 

我看到你的方法 Wolf5370,并提高你。

 internal static List<DirectoryInfo> Split(this DirectoryInfo path) { if(path == null) throw new ArgumentNullException("path"); var ret = new List<DirectoryInfo>(); if (path.Parent != null) ret.AddRange(Split(path.Parent)); ret.Add(path); return ret; } 

在pathc:\folder1\folder2\folder3返回

c:\

c:\folder1

c:\folder1\folder2

c:\folder1\folder2\folder3

以该顺序

要么

 internal static List<string> Split(this DirectoryInfo path) { if(path == null) throw new ArgumentNullException("path"); var ret = new List<string>(); if (path.Parent != null) ret.AddRange(Split(path.Parent)); ret.Add(path.Name); return ret; } 

将返回

c:\

folder1

folder2

folder3

  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - /// <summary> /// Use to emulate the C lib function _splitpath() /// </summary> /// <param name="path">The path to split</param> /// <param name="rootpath">optional root if a relative path</param> /// <returns>the folders in the path. /// Item 0 is drive letter with ':' /// If path is UNC path then item 0 is "\\" /// </returns> /// <example> /// string p1 = @"c:\p1\p2\p3\p4"; /// string[] ap1 = p1.SplitPath(); /// // ap1 = {"c:", "p1", "p2", "p3", "p4"} /// string p2 = @"\\server\p2\p3\p4"; /// string[] ap2 = p2.SplitPath(); /// // ap2 = {@"\\", "server", "p2", "p3", "p4"} /// string p3 = @"..\p3\p4"; /// string root3 = @"c:\p1\p2\"; /// string[] ap3 = p1.SplitPath(root3); /// // ap3 = {"c:", "p1", "p3", "p4"} /// </example> public static string[] SplitPath(this string path, string rootpath = "") { string drive; string[] astr; path = Path.GetFullPath(Path.Combine(rootpath, path)); if (path[1] == ':') { drive = path.Substring(0, 2); string newpath = path.Substring(2); astr = newpath.Split(new[] { Path.DirectorySeparatorChar } , StringSplitOptions.RemoveEmptyEntries); } else { drive = @"\\"; astr = path.Split(new[] { Path.DirectorySeparatorChar } , StringSplitOptions.RemoveEmptyEntries); } string[] splitPath = new string[astr.Length + 1]; splitPath[0] = drive; astr.CopyTo(splitPath, 1); return splitPath; } 

快速的答案是使用.Split('\\')方法。

 public static IEnumerable<string> Split(this DirectoryInfo path) { if (path == null) throw new ArgumentNullException("path"); if (path.Parent != null) foreach(var d in Split(path.Parent)) yield return d; yield return path.Name; } 

也许在一个循环中调用Directory.GetParent ? 这就是如果你想要每个目录的完整path,而不仅仅是目录名称。

有几种方式可以表示文件path。 您应该使用System.IO.Path类获取操作系统的分隔符,因为它可以在UNIX和Windows之间变化。 此外,大多数(或所有如果我没有错).NET库接受一个'\'或'/'作为path分隔符,无论操作系统。 出于这个原因,我会使用Path类来拆分path。 尝试如下所示:

 string originalPath = "\\server\\folderName1\\another\ name\\something\\another folder\\"; string[] filesArray = originalPath.Split(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); 

这应该工作,无论文件夹或名称的数量。

或者,如果您需要对每个文件夹执行某些操作,请查看System.IO.DirectoryInfo类。 它也有一个Parent属性,允许你导航到父目录。

我写了下面的方法,这对我有用。

 protected bool isDirectoryFound(string path, string pattern) { bool success = false; DirectoryInfo directories = new DirectoryInfo(@path); DirectoryInfo[] folderList = directories.GetDirectories(); Regex rx = new Regex(pattern); foreach (DirectoryInfo di in folderList) { if (rx.IsMatch(di.Name)) { success = true; break; } } return success; } 

与你的问题最相关的是:

DirectoryInfo directories = new DirectoryInfo(@path); DirectoryInfo [] folderList = directories.GetDirectories();

 DirectoryInfo objDir = new DirectoryInfo(direcotryPath); DirectoryInfo [] directoryNames = objDir.GetDirectories("*.*", SearchOption.AllDirectories); 

这会给你所有的目录和子目录。

我join了马特·布鲁内尔的回答。

  string[] directories = myStringWithLotsOfFolders.Split(Path.DirectorySeparatorChar); string previousEntry = string.Empty; if (null != directories) { foreach (string direc in directories) { string newEntry = previousEntry + Path.DirectorySeparatorChar + direc; if (!string.IsNullOrEmpty(newEntry)) { if (!newEntry.Equals(Convert.ToString(Path.DirectorySeparatorChar), StringComparison.OrdinalIgnoreCase)) { Console.WriteLine(newEntry); previousEntry = newEntry; } } } } 

这应该给你:

“\服务器”

“\服务器\ folderName1”

“\ server \ folderName1 \别名”

“\ server \ folderName1 \别名\ something”

“\ server \ folderName1 \另一个名称\东西\另一个文件夹\”

(或者通过每个值的string.Length对结果集合进行sorting。

这里是对Wolf的回答的一个修改,遗漏了根,并修复了似乎是几个错误。 我用它来生成面包屑,我不想显示根。

这是DirectoryInfotypes的扩展。

 public static List<DirectoryInfo> PathParts(this DirectoryInfo source, string rootPath) { if (source == null) return null; DirectoryInfo root = new DirectoryInfo(rootPath); var pathParts = new List<DirectoryInfo>(); var di = source; while (di != null && di.FullName != root.FullName) { pathParts.Add(di); di = di.Parent; } pathParts.Reverse(); return pathParts; }