遍历删除空文件夹

news2024/9/19 10:40:24

文章目录

    • 遍历删除空文件夹
    • 概述
    • 笔记
    • END

遍历删除空文件夹

概述

在手工整理openssl3.2编译完的源码工程中的文档, 其中有好多空文件夹.
做了一个小工具, 将空文件夹都遍历删除掉. 这样找文档方便一些.
删除后比对了一下, 空文件夹还真不少.
在这里插入图片描述

笔记

// EmptyDirRemove.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include "framework.h"
#include "EmptyDirRemove.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 唯一的应用程序对象

CWinApp theApp;

using namespace std;

CString get_moudle_path();
void DoMyTask();
void findDir(CString csDirPathName, CStringArray& csAryDirPathName);
void tryToDeleteEmptyDir(CStringArray& csAryDirPathName, CStringArray& csAryEmptyDirPathName);

int main()
{
    int nRetCode = 0;

    HMODULE hModule = ::GetModuleHandle(nullptr);

    if (hModule != nullptr)
    {
        // 初始化 MFC 并在失败时显示错误
        if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
        {
            // TODO: 在此处为应用程序的行为编写代码。
            wprintf(L"错误: MFC 初始化失败\n");
            nRetCode = 1;
        }
        else
        {
            // TODO: 在此处为应用程序的行为编写代码。
            DoMyTask();
        }
    }
    else
    {
        // TODO: 更改错误代码以符合需要
        wprintf(L"错误: GetModuleHandle 失败\n");
        nRetCode = 1;
    }

    _tprintf(_T("END\n"));
    system("pause");

    return nRetCode;
}

void DoMyTask()
{
    // 安全措施
    // * 不允许在根目录下运行

    CString csTmp;
    CStringArray csAryDirPathName;
    CStringArray csAryEmptyDirPathName;
    int i = 0;

    do {
        // D:\my_dev\my_local_git_prj\soft\EmptyDirRemove\Debug
        csTmp = get_moudle_path();
        if (csTmp.GetLength() <= 3)
        {
            _tprintf(_T("危险 : 不允许在根目录下运行此程序\r\n"));
        }

        i = AfxMessageBox(_T("即将尝试删除本程序同级目录下的空文件夹, 是否继续?"), MB_OKCANCEL);
        if (IDOK != i)
        {
            break;
        }

        findDir(csTmp, csAryDirPathName);

        do {
            _tprintf(_T("try %d\n"), ++i);
            tryToDeleteEmptyDir(csAryDirPathName, csAryEmptyDirPathName);
            if (0 == csAryEmptyDirPathName.GetCount())
            {
                break;
            }
        } while (true);
        

    } while (false);
}

void tryToDeleteEmptyDir(CStringArray& csAryDirPathName, CStringArray& csAryEmptyDirPathName)
{
    csAryEmptyDirPathName.RemoveAll();

    INT_PTR cnt = csAryDirPathName.GetCount();
    INT_PTR cnt2 = 0;
    INT_PTR i = 0;
    INT_PTR j = 0;
    CString cs;

    for (i = 0; i < cnt; i++)
    {
        cs = csAryDirPathName.GetAt(i);

        /*!
        * RemoveDirectory有个好特性, 如果目录非空, 是删除失败的
        * 所以可以用尝试删除的方法来删除文件夹, 不用怕, 放心大胆的搞:P
        */
        if (RemoveDirectory(cs))
        {
            _tprintf(_T("remove dir : %s\n"), (LPCTSTR)cs);
            csAryEmptyDirPathName.Add(cs);
        }
    }

    // 将已经删除的文件夹名称从csAryDirPathName中移除
    cnt = csAryEmptyDirPathName.GetCount();
    for (i = 0; i < cnt; i++)
    {
        cs = csAryEmptyDirPathName.GetAt(i);
        cnt2 = csAryDirPathName.GetCount();
        for (j = 0; j < cnt2; j++)
        {
            if (cs == csAryDirPathName.GetAt(j))
            {
                csAryDirPathName.RemoveAt(j);
                break;
            }
        }
    }

}

void findDir(CString csDirPathName, CStringArray& csAryDirPathName)
{
    CFileFind finder;

    // build a string with wildcards
    CString strWildcard(csDirPathName);
    strWildcard += _T("\\*.*");

    // start working for files
    BOOL bWorking = finder.FindFile(strWildcard);

    while (bWorking)
    {
        bWorking = finder.FindNextFile();

        // skip . and .. files; otherwise, we'd
        // recur infinitely!

        if (finder.IsDots())
            continue;

        // if it's a directory, recursively search it

        if (finder.IsDirectory())
        {
            CString str = finder.GetFilePath();
            // TRACE(_T("%s\n"), (LPCTSTR)str);
            csAryDirPathName.Add(str);
            findDir(str, csAryDirPathName);
        }
    }

    finder.Close();
}

CString get_moudle_path()
{
    CString szCurPath(_T(""));
    GetModuleFileName(NULL, szCurPath.GetBuffer(MAX_PATH), MAX_PATH);
    szCurPath.ReleaseBuffer();
    return szCurPath.Left(szCurPath.ReverseFind(_T('\\')) + 1);
}

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1422299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

音视频数字化(数字与模拟-音频广播)

在互联网飞速发展的今天,每晚能坐在电视机前面的人越来越少,但是每天收听广播仍旧是很多人的习惯。 从1906年美国费森登在实验室首次进行无线电广播算起,“广播”系统已经陪伴人们115年了。1916年,收音机开始上市,收音机核心是“矿石”。1920年开始“调幅”广播,1941年开…

Uniapp小程序端打包优化实践

背景描述&#xff1a; 在我们最近开发的一款基于uniapp的小程序项目中&#xff0c;随着功能的不断丰富和完善&#xff0c;发现小程序包体积逐渐增大&#xff0c;加载速度也受到了明显影响。为了提升用户体验&#xff0c;团队决定对小程序进行一系列打包优化。 项目优化点&…

Optimism的挑战期

1. 引言 前序博客&#xff1a; Optimism的Fault proof 用户将资产从OP主网转移到以太坊主网时需要等待一周的时间。这段时间称为挑战期&#xff0c;有助于保护 OP 主网上存储的资产。 而OP测试网的挑战期仅为60秒&#xff0c;以简化开发过程。 2. OP与L1数据交互 L1&#xf…

无人机除冰保障电网稳定运行

无人机除冰保障电网稳定运行 近日&#xff0c;受低温雨雪冰冻天气影响&#xff0c;福鼎市多条输配电线路出现不同程度覆冰。 为保障福鼎电网安全可靠运行&#xff0c;供电所员工运用无人机飞行技术&#xff0c;通过在无人机下方悬挂器具&#xff0c;将无人机飞到10千伏青坑线…

第5章 python深度学习——波斯美女

第5章 深度学习用于计算机视觉 本章包括以下内容&#xff1a; 理解卷积神经网络&#xff08;convnet&#xff09; 使用数据增强来降低过拟合 使用预训练的卷积神经网络进行特征提取 微调预训练的卷积神经网络 将卷积神经网络学到的内容及其如何做出分类决策可视化 本章将…

HBase表结构

HBase是非关系型数据库&#xff0c;是高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库。 HBase使用场景 大规模数据存储&#xff1a;如日志记录、数据库备份等。实时数据访问&#xff1a;如实时搜索、实时分析等。高性能读写&#xff1a;如高并发、低延迟的读写操…

(2)(2.10) LTM telemetry

文章目录 前言 1 协议概述 2 配置 3 带FPV视频发射器的使用示例 4 使用TCM3105的FSK调制解调器示例 前言 轻量级 TeleMetry 协议 (LTM) 是一种单向通信协议&#xff08;从飞行器下行的数据链路&#xff09;&#xff0c;可让你以低带宽/低波特率&#xff08;通常为 2400 波…

Linux下如何编译C/C++代码?从.c到.exe经历了什么?

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

百度智能小程序开发平台:SEO关键词推广优化 带完整的搭建教程

移动互联网的普及&#xff0c;小程序成为了众多企业和开发者关注的焦点。百度智能小程序开发平台为开发者提供了一站式的解决方案&#xff0c;帮助企业快速搭建并推广自己的小程序。本文将重点介绍百度智能小程序开发平台的SEO关键词推广优化功能&#xff0c;并带完整的搭建教程…

MySQL原理(三)锁定机制(1)综述

一、介绍&#xff1a; 1、锁的本质 业务场景中存在共享资源&#xff0c;多个进程或线程需要竞争获取并处理共享资源&#xff0c;为了保证公平、可靠、结果正确等业务逻辑&#xff0c;要把并发执行的问题变为串行&#xff0c;串行时引入第三方锁当成谁有权限来操作共享资源的判…

06 单目初始化器 Initializer

文章目录 06 单目初始化器 Initializer6.1 成员变量/函数6.2 初始化函数 Initialize()6.3 计算基础矩阵 F \boldsymbol{F} F 和单应矩阵 H \boldsymbol{H} H6.3.1 RANSAC 算法6.3.2 八点法计算 F \boldsymbol{F} F 矩阵: ComputeF21()6.3.3 计算基础矩阵 F \boldsymbol{F} …

基于yolov2深度学习网络的视频手部检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 输入mp4格式的视频文件进行测试&#xff0c;视频格式为1080p30. 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..........................…

大数据分析案例-基于随机森林算法构建电影票房预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

软连接和硬链接

1.软连接 软连接是一个独立的文件&#xff0c;有独立的inode&#xff0c;也有独立的数据块&#xff0c;它的数据块里面保存的是指向的文件路径-------相当于windows的快捷方式 删除一个软连接 2.硬链接 所谓的建立硬链接&#xff0c;本质就是在特定目录的数据块中新增文件名和…

【大数据】Flink SQL 语法篇(三):窗口聚合(TUMBLE、HOP、SESSION、CUMULATE)

Flink SQL 语法篇&#xff08;三&#xff09;&#xff1a;窗口聚合 1.滚动窗口&#xff08;TUMBLE&#xff09;1.1 Group Window Aggregation 方案&#xff08;支持 Batch / Streaming 任务&#xff09;1.2 Windowing TVF 方案&#xff08;1.13 只支持 Streaming 任务&#xff…

sqli-labs-master靶场训练笔记(1-22|新手村)

2024.1.21 level-1 &#xff08;单引号装饰&#xff09; 先根据提示建立一个get请求 在尝试使用单个单引号测试&#xff0c;成功发现语句未闭合报错 然后反手一个 order by 得到数据库共3列&#xff0c;-- 后面加字母防止浏览器吃掉 -- 操作&#xff08;有些会&#xff09…

Java关于Excel文件的导入导出

人生如梦 荣华富贵 如木槿之花 朝荣夕逝 需求 导出&#xff1a; 能够将库表内的数据导出多个Excel表&#xff0c;并且生成一个压缩包&#xff0c;提供用户下载导入&#xff1a; 能够将一个压缩包内的多个Excel表解压&#xff0c;并获取表内的所有数据 FileUtils 工具类 publi…

GPT-SoVITS 本地搭建踩坑

GPT-SoVITS 本地搭建踩坑 前言搭建下载解压VSCode打开安装依赖包修改内容1.重新安装版本2.修改文件内容 运行总结 前言 传言GPT-SoVITS作为当前与BertVits2.3并列的TTS大模型&#xff0c;于是本地搭了一个&#xff0c;简单说一下坑。 搭建 下载 到GitHub点击此处下载 http…

【三维重建】运动恢复结构(SfM)

运动恢复结构是通过三维场景的多张图像&#xff0c;恢复出该场景的三维结构信息以及每张图片对应的摄像机参数。 欧式结构恢复(内参已知&#xff0c;外参未知) 欧式结构恢复问题&#xff1a; 已知&#xff1a;1、n个三维点在m张图像中的对应点的像素坐标 2、相机内参 求解&…

指针的深入了解6

1.回调函数 回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向的函数 时&#xff0c;被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用&#xff0…