支持Windows和Linux的文件目录创建和删除操作

文件目录的创建和删除在Windows和Linux下使用的函数有所不同,这里整理了一份。另外在删除目录时,需要先删除目录中的内容。在这里只做了删除目录的内容,没有做删除当前目录的操作。代码如下:
file_util.h

#ifndef FILE_UTIL_H
#define FILE_UTIL_H

#ifdef WIN32
#include <windows.h>
#include <direct.h>
#include <io.h>
#else
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#endif // !WIN32

#include <cstring>
#include <string>

#ifdef WIN32
#define STRDUP(a) _strdup((a))
#define ACCESS _access
#define MKDIR(a) _mkdir((a))
#define RMDIR(a) _rmdir((a))
#else
#define STRDUP(a) strdup((a))
#define ACCESS access
#define MKDIR(a) mkdir((a), 0755)
#define RMDIR(a) rmdir((a))
#endif

struct BASE_DIR
{
#ifdef WIN32
    HANDLE dir;
    WIN32_FIND_DATAA file;
    bool eof;
#else
    DIR *dir;
    struct dirent *file;
#endif

    bool file_is_dir;
    std::string dir_name;
    std::string file_name;
};

int creatDir(const char *p_dir);
bool openDir(const char *dir_name, BASE_DIR &base_dir);
bool isOpenedDir(const BASE_DIR &base_dir);
void closeDir(BASE_DIR &base_dir);
bool removeDir(const char *dir_name);

#endif // !FILE_UTIL_H

file_util.cpp

#include "file_util.h"
#include <malloc.h>

// 创建目录,如果已经存在,则不会创建
int creatDir(const char *p_dir)
{
    int ret;
    char* p_dup_dir = STRDUP(p_dir);
    int len = strlen(p_dup_dir);
    for (int i = 0; i < len; i++) {
        if (p_dup_dir[i] == '\\' || p_dup_dir[i] == '/') {
            p_dup_dir[i] = '\0';
            ret = ACCESS(p_dup_dir, 0);
            if (ret != 0) {
                ret = MKDIR(p_dup_dir);
                if (ret != 0) {
                    return -1;
                }
            }
            p_dup_dir[i] = '/';
        }
    }

    ret = MKDIR(p_dup_dir);
    free(p_dup_dir);
    return ret;
}

bool openDir(const char *dir_name, BASE_DIR &base_dir)
{
    if (NULL == dir_name || '\0' == dir_name[0]) {
        return false;
    }

    base_dir.dir_name = dir_name;
    if ('/' != *base_dir.dir_name.rbegin()) {
        base_dir.dir_name += "/";
    }

#ifdef WIN32
    base_dir.file_name = base_dir.dir_name + "*";
    base_dir.dir = FindFirstFileA(base_dir.file_name.c_str(), &base_dir.file);
    if (INVALID_HANDLE_VALUE == base_dir.dir) {
        return false;
    }
    base_dir.eof = false;
#else
    base_dir.dir = opendir(dir_name);
    if (NULL == base_dir.dir) {
        return false;
    }
    base_dir.file = readdir(base_dir.dir);
#endif // WIN32

    return true;
}

bool isOpenedDir(const BASE_DIR &base_dir)
{
#ifdef WIN32
    return (INVALID_HANDLE_VALUE != base_dir.dir);
#else
    return (NULL != base_dir.dir);
#endif // WIN32
}

void closeDir(BASE_DIR &base_dir)
{
    if (!isOpenedDir(base_dir)) {
        return;
    }

#ifdef WIN32
    FindClose(base_dir.dir);
    base_dir.dir = INVALID_HANDLE_VALUE;
#else
    closedir(base_dir.dir);
    base_dir.dir = NULL;
#endif // WIN32
}

bool removeDir(const char *dir_name)
{
    BASE_DIR base_dir;

    if (!openDir(dir_name, base_dir)) {
        return false;
    }

#ifdef WIN32
    while (!base_dir.eof) {
        WIN32_FIND_DATAA file = base_dir.file;
        base_dir.eof = !FindNextFileA(base_dir.dir, &base_dir.file);

        if (0 != strcmp(file.cFileName, ".") && 0 != strcmp(file.cFileName, "..")) {
            base_dir.file_name = base_dir.dir_name + file.cFileName;
            base_dir.file_is_dir = (0 != (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY));
            if (base_dir.file_is_dir) {
                removeDir(base_dir.file_name.c_str());
                RMDIR(base_dir.file_name.c_str());
            }
            else {
                remove(base_dir.file_name.c_str());
            }

        }
    }
#else
    while (NULL != base_dir.file) {
        struct dirent *file = base_dir.file;
        base_dir.file = readdir(base_dir.dir);

        if (0 != strcmp(file->d_name, ".") && 0 != strcmp(file->d_name, "..")) {
            base_dir.file_name = base_dir.dir_name + file->d_name;
            base_dir.file_is_dir = false;

            struct stat stat_buf;
            if (-1 != lstat(base_dir.file_name.c_str(), &stat_buf) && 0 != (S_IFDIR & stat_buf.st_mode)) {
                base_dir.file_is_dir = true;
            }
            if (base_dir.file_is_dir) {
                removeDir(base_dir.file_name.c_str());
                RMDIR(base_dir.file_name.c_str());
            }
            else {
                remove(base_dir.file_name.c_str());
            }
        }
    }
#endif // WIN32

    closeDir(base_dir);

    return true;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值