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

Posted 大冰的小屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了支持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;

以上是关于支持Windows和Linux的文件目录创建和删除操作的主要内容,如果未能解决你的问题,请参考以下文章

Linux 基础命令

Linux 文件/目录管理(初级)

Linux软链接的创建,删除,修改

ctime, mtime, 存放目录, windows, linux

Windows10如何在终端创建文件和删除文件

Linux常用命令