C++ 判断目录是否存在以及创建多级目录
0、不同平台下的头文件
#if defined(_WIN32) || defined(_WIN32_WCE)
#define MSWINDOWS
#endif
#ifdef MSWINDOWS
#include <windows.h>
#include <direct.h>
#include <fcntl.h>
#include <io.h>
#include <sys/types.h>
#include <sys/stat.h>
#else //Linux
#include <dirent.h>
#include <fcntl.h>
#include <sys/param.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#endif
1、Windows 系统下的方法
1.1、判定文件或文件夹是否存在
在实际项目中,通常有这样的需求:判断文件夹或文件是否存在,并决定后续的操作。
函数原型如下: 头文件:<io.h>
函数原型:int _access(const char *pathname, int mode);参数:pathname 为文件路径或目录路径, mode 为访问权限(在不同系统中可能用不能的宏定义重新定义)
返回值:如果文件具有指定的访问权限,则函数返回0;如果文件不存在或者不能访问指定的权限,则返回-1.
备注:当pathname为文件时,_access函数判断文件是否存在,并判断文件是否可以用mode值指定的模式进行访问。当pathname为目录时,_access只判断指定目录是否存在
#include <iostream>
#include <io.h>
#include <direct.h>
using namespace std;
int main()
{
string folder1 = "./head/test/";
string folder2 = "./head/test1/render_face/";
int mode = 0; // 判定目录或文件是否存在的标识符
if (_access(folder1.c_str(), mode))
{
//system("mkdir head");
_mkdir(folder1.c_str());
}
if (_access(folder2.c_str(), mode))
{
_mkdir(folder2.c_str());
}
return 0;
}
1.2、创建文件夹
当文件夹不存在时,通常需要创建文件夹来保存中间文件。具体代码见上面的代码片段,_mkdir()
,有时候 mkdir
也可以(access同理)。没有下划线的位不符合ISO c++
标准的写法,标准要求带下划线的标准,没有下划线的是为了兼容以前的版本。该函数需要导入头文件#include <direct.h>
,还有一些注意的见下面说明:
folder1 = "./head/test/" :使用_mkdir时,会创建失败,因为该函数不能创建多级目录,必须一级一级的创建.
system("mkdir .\\head\\test\\") 可以创建完成,注意:windows下,必须用`\\`,不能用`/`,否则会出现语法错误.
2、Linux 系统下的方法
2.1、判断文件夹是否存在
方法1:access()
函数,注意与windows下写法的区别
std::string result_path = save_path + "ply/";
if (access(result_path.c_str(), 0))
{
std::cout << "folder is not exist, create it ..." << std::endl;
create_multilevel_directories(save_path.c_str());
}
else
{
std::cout << "folder is exist already, not create it ..." << std::endl;
}
方法2:stat()
函数
const char* folderPath = result_path.c_str();
struct stat info;
if (stat(folderPath, &info) != 0)
{
printf("%s does not exist.\n", folderPath);
}
else if (info.st_mode & S_IFDIR)
{
printf("%s exists and is a directory.\n", folderPath);
}
else
{
printf("%s exists but is not a directory.\n", folderPath);
}
2.2、创建多级文件夹
void create_multilevel_directories(const char* dir)
{
char command[100] = "mkdir -p ";
strcat(command, dir);
// 调用系统命令,执行 mkdir -p
system(command);
}