支持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的文件目录创建和删除操作的主要内容,如果未能解决你的问题,请参考以下文章