C++递归删除一个目录实例

yizhihongxing

要递归删除一个目录,可以使用以下步骤:

  1. 使用built-in函数或者第三方库来获取目录下的所有文件和子目录
  2. 遍历所有子目录,并递归调用删除子目录的函数
  3. 遍历所有文件,并通过系统调用或者库函数将其删除
  4. 最终删除根目录

下面是一个标准的C++代码示例,调用了Windows API函数来实现删除目录的操作:

#include <iostream>
#include <Windows.h>
#include <tchar.h>

void deleteDirectory(LPCTSTR strFolderPath)
{
    TCHAR szDir[MAX_PATH];
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind = INVALID_HANDLE_VALUE;

    _tcscpy_s(szDir, strFolderPath);
    _tcscat_s(szDir, _T("\\*"));

    // 在目录下搜索第一个文件并删除
    hFind = FindFirstFile(szDir, &FindFileData);
    if (INVALID_HANDLE_VALUE == hFind)
    {
        return;
    }

    do
    {
        if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if (_tcscmp(FindFileData.cFileName, _T(".")) != 0 && _tcscmp(FindFileData.cFileName, _T("..")) != 0)
            {
                TCHAR szSubDir[MAX_PATH];
                _stprintf_s(szSubDir, _T("%s\\%s"), strFolderPath, FindFileData.cFileName);
                deleteDirectory(szSubDir);
            }
        }
        else
        {
            TCHAR szFilePath[MAX_PATH];
            _stprintf_s(szFilePath, _T("%s\\%s"), strFolderPath, FindFileData.cFileName);
            DeleteFile(szFilePath);
        }
    } while (FindNextFile(hFind, &FindFileData) != 0);

    FindClose(hFind); // 关闭搜索

    RemoveDirectory(strFolderPath); // 删除当前目录
}

int main()
{
    LPCTSTR strFolderPath = _T("C:\\TestFolder");
    deleteDirectory(strFolderPath);
    return 0;
}

上面的代码中,我们首先用 _tcscpy_s(szDir, strFolderPath); 将要删除的目标目录路径赋值给 szDir,之后使用 _tcscat_s* 添加到 szDir 之后,以便搜索文件和目录。然后我们使用函数 FindFirstFile 来获取目录下的第一个文件并删除它,并通过 FindNextFile 函数来获取下一个文件,直到找不到为止。在每一个文件的循环中,我们会判断这个文件是否是文件夹。如果是,我们把这个文件夹作为参数递归调用 deleteDirectory 函数并将它删除。如果不是,我们使用 DeleteFile 函数来删除它。循环结束后,我们最后删除整个目录。

下面是另一个示例,它需要递归地删除目录结构,同时忽略一些类型的文件(例如,.git 目录和 .gitignore 文件):

void recursiveDelete(boost::filesystem::path path,
        const std::set<std::string>& ignoreFiles)
{
    if (!boost::filesystem::exists(path))
    {
        return;
    }

    if (boost::filesystem::is_directory(path))
    {
        boost::filesystem::directory_iterator endIterator;
        for (boost::filesystem::directory_iterator directoryIterator(path); directoryIterator != endIterator; ++directoryIterator)
        {
            if (boost::filesystem::is_directory(*directoryIterator))
            {
                recursiveDelete(directoryIterator->path(), ignoreFiles);
            }
            else
            {
                bool ignore = false;
                for (auto ignoreFile : ignoreFiles)
                {
                    if (ignoreFile == directoryIterator->path().filename().string())
                    {
                        ignore = true;
                        break;
                    }
                }

                if (!ignore)
                {
                    boost::filesystem::remove(directoryIterator->path());
                }
            }
        }

        boost::filesystem::remove(path);
    }
    else if (boost::filesystem::is_regular_file(path))
    {
        boost::filesystem::remove(path);
    }
}

在上面的代码中,我们首先检查目录是否存在到该路径并且是一个目录。如果不是,我们只需要删除该文件即可。否则,我们通过遍历目录结构来删除每个文件和子目录。

如果当前条目是一个子目录,我们用recursiveDelete函数递归地删除它,并跳过忽略文件列表中列出的文件。在清除完所有文件和子目录之后,我们最终删除当前目录。

这个示例使用了 Boost C++ 库来获得文件系统的功能。注意,为了使用 Boost 中的文件系统模块,您需要相应的依赖/库。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++递归删除一个目录实例 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 在文件夹右键菜单中添加“进入DOS”命令的方法

    为了在文件夹右键菜单中添加“进入DOS”命令,我们需要按照以下步骤操作: 打开资源管理器,找到需要添加“进入DOS”命令的文件夹。 在文件夹地址栏中输入“cmd”,进入命令提示符窗口。 在命令提示符窗口中输入“explorer .”,打开当前文件夹。 依次点击“文件”、“另存为”,在保存类型中选择“所有文件(.)”,将文件名命名为“cmd-here.reg”…

    other 2023年6月27日
    00
  • vue中如何获取本地IP地址

    获取本地IP地址在Vue中可以通过JavaScript来实现。下面是一种常见的方法: 首先,在Vue组件中创建一个方法来获取本地IP地址。可以使用window对象的RTCPeerConnection接口来实现。代码如下: methods: { getLocalIPAddress() { return new Promise((resolve, reject)…

    other 2023年7月31日
    00
  • 深入AndroidManifest.xml文件解析详解

    以下是使用标准的Markdown格式文本,详细讲解深入AndroidManifest.xml文件解析的完整攻略: 深入AndroidManifest.xml文件解析 AndroidManifest.xml是Android应用的清单文件,它包含了应用的基本信息、组件声明、权限要求等重要信息。深入理解和解析AndroidManifest.xml文件可以帮助我们更…

    other 2023年10月14日
    00
  • vnote:一个舒适的markdown笔记软件

    vnote:一个舒适的markdown笔记软件 在写作、笔记、博客排版等场景中,Markdown已越来越受欢迎。但是,纯粹的Markdown编辑器还是过于简单了些,不够智能、方便、美观。这时候,一款好用的Markdown笔记软件就尤为重要。 今天,我要介绍一款非常好用的Markdown笔记软件——vnote。 安装 vnote支持Windows、MacOS和…

    其他 2023年3月28日
    00
  • 细说FAT16与FAT32区别

    细说FAT16与FAT32区别 一、概述 在储存数据时,我们常常会使用FAT16和FAT32这两种文件系统。虽然它们都是FAT格式,但它们之间确实存在一些细微的区别。FAT16是早期文件系统,在磁盘大小小于2GB的时候非常流行,而FAT32则是后来开发的更现代的文件系统,它支持更大的磁盘大小。 二、区别 下面是FAT16和FAT32的主要区别: 1. 簇大小…

    other 2023年6月27日
    00
  • 如何实现bean初始化摧毁方法的注入

    实现bean初始化摧毁方法的注入,需要通过Spring的IOC容器实现。Spring提供了两种方式来实现bean的初始化和销毁方法的注入:使用注解和使用XML配置文件。 一、使用注解的方式: 使用注解@PostConstruct来指定bean初始化方法,使用@PreDestroy来指定bean销毁方法。 @Component public class MyB…

    other 2023年6月20日
    00
  • ubuntu下命令行播放器mplayer使用详解

    以下是详细讲解“ubuntu下命令行播放器mplayer使用详解的完整攻略”的标准Markdown格式文本: Ubuntu下命令行播放器mplayer使用详解 mplayer是一款开源的命令行播放器,支持多种音视频格式,包括MPEG、AVI、ASF、WMV、WMA、MP3等。本攻略将介绍mplayer的安装、基本使用方法和常用参数等内容。 1. 安装mpla…

    other 2023年5月10日
    00
  • U盘文件夹变空文件夹的文件名乱码的修复方法

    针对“U盘文件夹变空文件夹的文件名乱码”的修复方法,我整理了以下完整攻略: 问题描述 使用U盘存储文件时,发现某些文件夹因为某些原因变成了空文件夹,并且文件夹的文件名变为乱码。这时候打开文件夹,里面没有任何文件,但是U盘的存储空间却不会反映出来。这种情况下如何修复这些文件夹? 解决方案 这种情况下,通常是因为U盘发生了错误而导致的。我们可以采用如下方法进行修…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部