C++递归删除目录下所有文件(macOS和windows两种)

最近各种搞C++文件操作, 顺手记录一下
也可以加个系统判断把这两段结合起来写个兼容方法

macOS

#include 
#include 

using namespace std;

void removeDir(const char* dirPath)
{
    struct dirent *dirp;

    cout << "dirPath:" <<dirPath << endl;
    DIR* dir = opendir(dirPath);
    
    while ((dirp = readdir(dir)) != nullptr) {
        // 完整路径
        string name = dirp->d_name;
        string path = dirPath;
        if (dirp->d_type == DT_REG) {
            // 文件
            remove((path+name).c_str());
            cout << "文件路径" << path+name << endl;
        } else if (dirp->d_type == DT_DIR) {
            // 文件夹
						// 此处需注意特殊系统文件
            if(name!="." && name!=".."){
                removeDir((path+name+"/").c_str());
                cout << "文件夹路径" << path+name+"/" << endl;
            }
        }
    }
    
    closedir(dir);
}

windows

#include 
#include 

using namespace std;

void  removeDir(const char* dirPath)
{
    struct _finddata_t fb;   // 查找相同属性文件的存储结构体
    char  path[250];
    long long  handle; // 注意此处需要long*2
    int   noFile;            // 对系统隐藏文件的处理标记

    noFile = 0;
    handle = 0;

    // 制作路径
    strcpy(path, dirPath);
    strcat(path, "/*");

    handle = _findfirst(path, &fb);
    // 找到第一个匹配的文件
    if (handle != 0)
    {
        // 当可以继续找到匹配的文件,继续执行
        while (0 == _findnext(handle, &fb))
        {
            // windows下,常有个系统文件,名为“..”,对它不做处理
            noFile = strcmp(fb.name, "..");

            if (0 != noFile)
            {
                // 制作完整路径
                memset(path, 0, sizeof(path));
                strcpy(path, dirPath);
                strcat(path, "/");
                strcat(path, fb.name);
                // 属性值为16,则说明是文件夹,迭代
                if (fb.attrib == 16)
                {
                    removeDir(path);
                }
                // 非文件夹的文件,直接删除。对文件属性值的情况没做详细调查,可能还有其他情况。
                else
                {
                    remove(path);
                }
            }
        }
        // 关闭文件夹,只有关闭了才能删除。找这个函数找了很久,标准c中用的是closedir
        // 经验介绍:一般产生Handle的函数执行后,都要进行关闭的动作。
        _findclose(handle);
    }
}

你可能感兴趣的:(笔记,c++,macos,windows)