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

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

  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日

相关文章

  • linux 进行批量下载文件操作

    linux 进行批量下载文件操作 在日常的工作中,我们可能会需要下载许多文件,如果一个个手动下载会比较耗时费力。不过在 Linux 系统中,我们可以使用一些命令来进行批量下载,提高我们的效率。 使用 wget 下载文件 wget 是一个常用的下载工具,它可以从 HTTP、HTTPS、FTP 等协议中下载文件。使用 wget 下载文件非常简单,只需要在终端中输…

    其他 2023年3月29日
    00
  • QQ图片无法加载怎么办?手机QQ加载图片方法

    标题:QQ图片无法加载怎么办? 在使用QQ时,我们可能会遇到图片无法加载的情况,下面是一些方法可以帮助你解决这个问题: 检查网络连接 首先,我们需要确认网络连接是否正常,如果网络连接不稳定或断开,QQ就无法加载图片。可以尝试其他网站或应用程序,以确定是不是QQ的问题。 清除缓存 当QQ使用时间越长,它的缓存就会越大,这可能导致图片无法加载。您可以尝试清除QQ…

    other 2023年6月25日
    00
  • fedora 23 lvm2格式 根目录磁盘空间不足 扩容方法

    Fedora 23 LVM2格式根目录磁盘空间不足扩容方法 如果你在使用Fedora 23系统时发现根目录磁盘空间不足,需要进行扩容。本攻略将为你详细介绍如何使用LVM2扩展根目录磁盘空间。 确认LVM2磁盘分区 首先,需要确认系统使用LVM2格式进行分区。在终端中执行以下命令: sudo fdisk -l 该命令将列出系统上所有的磁盘和磁盘分区。如果你看到…

    other 2023年6月27日
    00
  • Mybatis-Plus实现公共字段自动赋值的方法

    下面是关于”Mybatis-Plus实现公共字段自动赋值的方法”的详细讲解: 什么是公共字段自动赋值 在许多实际的应用场景中,我们需要在插入或者更新数据时自动赋值某些公共字段,比如创建时间、更新时间、创建人、更新人等信息。这些公共字段信息通常是由系统自动维护,并且在插入或更新时需要自动赋值,而不是由用户手动设置。Mybatis-Plus提供了一个非常方便的方…

    other 2023年6月27日
    00
  • 基于Python的接口自动化unittest测试框架和ddt数据驱动详解

    以下是基于Python的接口自动化unittest测试框架和ddt数据驱动的完整攻略: 1. 安装unittest和ddt库 首先,确保您已经安装了Python,并使用pip命令安装unittest和ddt库: pip install unittest pip install ddt 2. 创建测试类和测试方法 在Python中,使用unittest库创建测…

    other 2023年10月16日
    00
  • 7——使用textview实现跑马灯

    7——使用TextView实现跑马灯 在Android应用的开发中,使用跑马灯效果可以给用户带来视觉上的特殊体验,增加应用的吸引力。在Android中,我们可以使用TextView实现跑马灯效果。 基本实现 使用TextView实现跑马灯效果非常简单。我们只需要在布局文件中添加TextView,并设置相关属性即可。以下是实现跑马灯效果的示例代码: <T…

    其他 2023年3月28日
    00
  • 不升级都不行 Windows 10 Build 10074版下载地址(32位/64位)

    不升级都不行 Windows 10 Build 10074版下载地址(32位/64位)攻略 Windows 10 Build 10074是Windows 10操作系统的一个早期版本,如果你想尝试这个版本,下面是一个详细的攻略,包含了下载地址和两个示例说明。 下载地址 你可以从以下链接下载Windows 10 Build 10074的32位和64位版本: 32…

    other 2023年8月4日
    00
  • c#程序调用cmd执行命令(转)

    c#程序调用cmd执行命令(转) 在开发过程中,我们经常需要通过c#程序去调用操作系统的一些命令。在Windows系统中,CMD命令行界面是比较常用的一种方式。本文将介绍如何使用C#程序调用CMD执行命令。 方法一:使用Process类 Process类是C#程序中用于执行外部进程的一个类,也可以使用它来执行CMD命令。 示例代码: Process proc…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部