惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
美团技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
Y
Y Combinator Blog
T
Tailwind CSS Blog
D
Docker
博客园 - Franky
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Google DeepMind News
Google DeepMind News
腾讯CDC
Vercel News
Vercel News
Engineering at Meta
Engineering at Meta
U
Unit 42
The Cloudflare Blog
S
SegmentFault 最新的问题
WordPress大学
WordPress大学
爱范儿
爱范儿
Recent Announcements
Recent Announcements
博客园 - 聂微东
博客园 - 叶小钗
H
Help Net Security
MyScale Blog
MyScale Blog

博客园 - double64

MSVC 特有的 pragma C# 字符串转换 MFC 单文档无边框最大化全屏 MFC 单文档去掉菜单栏 MFC 对话框去边框最大化全屏 C++ 动态数组 C++ 安全的拷贝赋值(Copy-and-Swap 惯用法) C++ 基类派生类的 static_cast 和 dynamic_cast 转换的简单测试 visual studio 的 snippet 代码片段模板样式 Windows 右键管理官方小程序Autoruns C++ 结合 enum 按位与或组合检测枚举项 std::unique_ptr 当删除器类型为 无状态的时构造可以不用传删除器示例 两个用来写 CLI - Command-Line Interface 的命令解析库 enum class 类型转换 int 微软输入法中如何输出当前时间 音程知识 C++ 模板引用参数的各种情况 英语 12 种时态 Qt 手动添加 Q_OBJECT 需要添加的地方 C# WPF 绑定 ObservableObject 实现 INotifyPropertyChanged 接口 C++ 标准库 copy_if C++ lambda 和 bind 何时优先使用 Windows 下的 Qt 中 min max 函数冲突 C++ RVO 或 NRVO 可能触发的条件 C++ std::unique_ptr 和 std::shared_ptr 都支持自定义删除器(deleter) C++ 智能指针和动态数组 std::vector 插入另一个 vector 的范围元素 Qt tableWidget QTableWidget 常用一些属性设置 C++ 内部类(嵌套类)是可以访问外部类的私有保护成员的 C++ 宏展开顺序
C# 遍历删除空文件夹
double64 · 2026-08-13 · via 博客园 - double64
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        if (args.Length == 0)
        {
            Console.WriteLine("用法: xxx.exe <目录路径>");
            Console.WriteLine("示例: xxx.exe C:\\MyFolder");
            Console.ReadKey();
            return;
        }

        string rootPath = args[0];

        if (!Directory.Exists(rootPath))
        {
            Console.WriteLine($"路径不存在: {rootPath}");
            Console.ReadKey();
            return;
        }

        DeleteEmptyDirectories(rootPath);
    }

    static void DeleteEmptyDirectories(string rootPath)
    {
        // 1. 获取所有子目录(递归)
        var allDirs = Directory.GetDirectories(rootPath, "*", SearchOption.AllDirectories);

        // 2. 按路径长度降序排列(深度优先:从最深层开始)
        var sortedDirs = allDirs.OrderByDescending(d => d.Length).ToList();

        int deletedCount = 0;

        // 3. 遍历删除空目录
        foreach (var dir in sortedDirs)
        {
            if (IsDirectoryEmpty(dir))
            {
                try
                {
                    Directory.Delete(dir);
                    Console.WriteLine($"删除空目录: {dir}");
                    deletedCount++;
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"删除失败: {dir},原因: {ex.Message}");
                }
            }
        }

        // 4. 检查并删除根目录
        if (IsDirectoryEmpty(rootPath))
        {
            try
            {
                Directory.Delete(rootPath);
                Console.WriteLine($"删除空根目录: {rootPath}");
                deletedCount++;
            }
            catch (Exception ex)
            {
                Console.WriteLine($"删除根目录失败: {rootPath},原因: {ex.Message}");
            }
        }

        Console.WriteLine($"共删除 {deletedCount} 个空文件夹");
    }

    static bool IsDirectoryEmpty(string dirPath)
    {
        // 如果目录不存在,返回 true
        if (!Directory.Exists(dirPath)) return true;

        // 检查是否包含任何文件或子目录
        return !Directory.EnumerateFileSystemEntries(dirPath).Any();
    }
}