C/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);
} 
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值