You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:18:58