C++:文件操作
1. 如果不存在文件夹就创建文件夹
函数access可以判断文件或文件夹是否存在。mkdir可以创建文件夹,但不能递归创建。这里写了一个函数mkdirp用于递归创建文件夹。
#include <iostream>
#include <unistd.h>
#include <sys/stat.h>
#include <sstream>
using namespace std;
int mkdirp(const string path) {
string temp_path = path;
if(temp_path[0] == '/')
if(temp_path.substr(0, 5).compare("/home") != 0)
return -1;
for(size_t i=1; i<temp_path.length(); i++)
if(temp_path[i] == '/')
temp_path[i] = ' ';
string prefix = "";
stringstream ss;
ss << temp_path;
while(ss >> temp_path) {
prefix += temp_path;
//cout << prefix << endl;
if(access(prefix.c_str(), F_OK) != 0)
if(mkdir(prefix.c_str(), S_IRUSR | S_IWUSR | S_IXUSR | S_IRWXG | S_IRWXO) !=0)
return -1;
prefix += '/';
}
return 0;
}
int main() {
const string output_dir = "/home/<yourname>/video/1/2/asd";
cout << mkdirp(output_dir) << endl;
}
- 第11 - 13行:如果从根目录创建文加夹,确保只能从/home开始。
- 第15 - 17行:从下标1开始,把路径字符串的’ / '换成空格,这样便于使用stringstream分割字符串。之所以不从下标0开始,是因为路径可能以/home开始。
- 第26行:判断文件夹是否存在。
- 第27行:判断创建文件夹是否成功。
[参考]
还可以使用system函数执行系统命令递归地创建文件夹:
#include <unistd.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
void mkdirp(const string Path) {
if(access(Path.c_str(), F_OK) == -1) {
string dir = "mkdir -p " + Path;
system(dir.c_str());
}
}
int main() {
const string output_dir = "/home/omen/video/1/2/asd";
mkdirp(output_dir);
}