C#:从完整文件路径提取文件夹名并遍历所有层级目录
我来帮你搞定这两个C#目录操作的需求,咱们逐个说清楚:
一、从完整文件路径提取文件夹名
根据你的场景,分两种常见情况处理,直接用.NET自带的Path类就能轻松实现:
1. 从文件路径提取所在文件夹
如果给的是文件的完整路径,想要获取它所在的文件夹路径:
string filePath = @"H:\Folder\TopLevel\Sub-Directory\demo.txt"; // 获取文件所在的文件夹路径 string parentFolder = Path.GetDirectoryName(filePath); Console.WriteLine(parentFolder); // 输出:H:\Folder\TopLevel\Sub-Directory
2. 从目录路径提取最后一级文件夹名称
如果给的是目录的完整路径,想要获取最末尾的那个文件夹名:
string dirPath = @"H:\Folder\TopLevel\Sub-Directory"; // 提取最后一级文件夹名称 string folderName = Path.GetFileName(dirPath); Console.WriteLine(folderName); // 输出:Sub-Directory
哪怕路径末尾带斜杠也没问题,Path.GetFileName会自动处理:
string dirPathWithSlash = @"H:\Folder\TopLevel\Sub-Directory\"; string folderName = Path.GetFileName(dirPathWithSlash); // 依然输出:Sub-Directory
二、遍历指定目录下所有层级的目录结构
你当前代码只能获取直接子目录,是因为Directory.GetDirectories()默认只查一级目录。要遍历所有层级,有两种实用的实现方式:
方式1:直接用Directory.GetDirectories的重载方法
只需要添加SearchOption.AllDirectories参数,就能一次性获取所有层级的目录:
using System; using System.IO; namespace FolderStructure { public class Folder { static void Main(string[] args) { string rootDir = @"H:\Folder\TopLevel\Sub-Directory"; // 第三个参数指定递归所有子目录 string[] allDirs = Directory.GetDirectories(rootDir, "*", SearchOption.AllDirectories); // 先输出根目录本身 Console.WriteLine(rootDir); // 遍历输出所有子目录 foreach (var dir in allDirs) { Console.WriteLine(dir); } Console.ReadLine(); } } }
方式2:递归遍历(更灵活,支持树形结构展示)
如果想要更直观的树形目录结构(带缩进),或者需要在遍历过程中做自定义操作,递归是更好的选择:
using System; using System.IO; namespace FolderStructure { public class Folder { static void Main(string[] args) { string rootDir = @"H:\Folder\TopLevel\Sub-Directory"; // 先输出根目录 Console.WriteLine(rootDir); // 从根目录的下一级开始递归,初始层级为1(控制缩进) TraverseDirs(rootDir, 1); Console.ReadLine(); } static void TraverseDirs(string parentDir, int level) { string[] subDirs; // 加try-catch避免因权限问题导致程序崩溃 try { subDirs = Directory.GetDirectories(parentDir); } catch (UnauthorizedAccessException) { string indent = new string(' ', level * 4); Console.WriteLine($"{indent}├─ [无法访问: {Path.GetFileName(parentDir)}]"); return; } foreach (var dir in subDirs) { // 按层级生成缩进,让结构更清晰 string indent = new string(' ', level * 4); // 只显示最后一级目录名,避免重复输出长路径 string dirName = Path.GetFileName(dir); Console.WriteLine($"{indent}├─ {dirName}"); // 递归遍历下一级目录,层级+1 TraverseDirs(dir, level + 1); } } } }
这种方式输出的结构会像这样,非常直观:
H:\Folder\TopLevel\Sub-Directory ├─ Sub-Folder 1 ├─ Sub-Sub-Folder A ├─ Sub-Sub-Folder B ├─ Sub-Folder 2 ├─ Sub-Sub-Folder C
内容的提问来源于stack exchange,提问作者user7791824
相关产品推荐
相关产品推荐

