C++创建文件夹和文件夹下相关操作

1、直接上干活!

cpp 复制代码
/*****************************************************************//**
 * \file   FilesTools.h
 * \brief  
 * 
 * \author YZS
 * \date   December 2024
 *********************************************************************/
#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<iostream>
#include <string>
#include <map>
#include <io.h>
#include <vector>
#include <fstream>

#include <sstream>
#include <iomanip>
#include <algorithm>
#include <cstdint>

#include <iostream>
#include <fstream>
#include <stdexcept>
#include <cctype>
#include <cerrno> // errno
#include <cstring> // std::strerror
#include <cstdio> // std::rename

#if defined(_WIN32)
#   include <direct.h>
#   include <io.h>
#   include <shlobj.h>
#   include <sys/stat.h>
#   include <sys/types.h>
#else // Linux, OSX, ...
#   include <dirent.h>
#   include <unistd.h>
#   include <sys/stat.h>
#   include <sys/types.h>
#   include <pwd.h>
#endif


// getAllFiles 和 AutoGetFileName 相同
void getFiles(const std::string& path, std::vector<std::string>& files)
{
	//文件句柄
	long long hFile = 0;
	//文件信息,_finddata_t需要io.h头文件
	struct _finddata_t fileinfo;
	std::string p;
	int i = 0;
	if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
	{
		do
		{
			//如果是目录,迭代之
			//如果不是,加入列表
			if ((fileinfo.attrib & _A_SUBDIR))
			{
				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
					getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
			}
			else
			{
				files.push_back(p.assign(path).append("\\").append(fileinfo.name));
			}
		} while (_findnext(hFile, &fileinfo) == 0);
		_findclose(hFile);
	}
}

//读取某给定路径下所有文件夹与文件名称,并带完整路径
void getAllFiles(std::string path, std::vector<std::string>& files)
{
	using namespace std;
	//文件句柄
	long long  hFile = 0;
	//文件信息
	struct _finddata_t fileinfo;
	string p;
	if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
	{
		do
		{
			if ((fileinfo.attrib & _A_SUBDIR))
			{
				//文件夹
				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
				{
					files.push_back(p.assign(path).append("\\").append(fileinfo.name));
					//getFilesall(p.assign(path).append("\\").append(fileinfo.name), files);

					getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files);
				}
			}
			else
			{
				//文件名字
				files.push_back(p.assign(path).append("\\").append(fileinfo.name));
			}
		} while (_findnext(hFile, &fileinfo) == 0);
		_findclose(hFile);
	}
}

void AutoGetFileName(std::string path, std::vector<std::string>& veflies, std::string filetype)
{
	using namespace std;
	long long hFile = 0;

	struct _finddata_t fileinfo;
	string p;
	if ((hFile = _findfirst(p.assign(path).append("\\*" + filetype).c_str(), &fileinfo)) != -1)
	{
		do
		{
			veflies.push_back(p.assign(path).append("\\").append(fileinfo.name));
		} while (_findnext(hFile, &fileinfo) == 0);
		_findclose(hFile);
	}
}

//同理,只读取某给定路径下所有文件夹名(以下类似,只给出函数,调用案例同上):
void getJustCurrentDir(std::string path, std::vector<std::string>& files)
{
	using namespace std;
	//文件句柄
	long long  hFile = 0;
	//文件信息
	struct _finddata_t fileinfo;
	string p;
	if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
	{
		do
		{
			if ((fileinfo.attrib & _A_SUBDIR))
			{
				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
				{
					//只是包含文件夹名字
					//files.push_back(fileinfo.name);

					//getJustCurrentDir(p.assign(path).append("\\").append(fileinfo.name), files);

					//包含路径+文件夹名字
					//files.push_back(p.assign(path).append("\\").append(fileinfo.name));
					files.push_back(p.assign(path).append("\\").append(fileinfo.name));

					//扫描所有的文件夹
					getJustCurrentDir(p.assign(path).append("\\").append(fileinfo.name), files);
				}
			}
		} while (_findnext(hFile, &fileinfo) == 0);
		_findclose(hFile);
	}
}

/// 只读取某给定路径下的当前文件名:
void getJustCurrentFile(std::string path, std::vector<std::string>& files)
{
	using namespace std;
	//文件句柄
	long long  hFile = 0;
	//文件信息
	struct _finddata_t fileinfo;
	string p;
	if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
	{
		do
		{
			if ((fileinfo.attrib & _A_SUBDIR))
			{
				;
			}
			else
			{
				files.push_back(fileinfo.name);
				//files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
			}
		} while (_findnext(hFile, &fileinfo) == 0);
		_findclose(hFile);
	}
}



std::string left(std::string const& str, std::size_t chars);

/** Returns the rightmost 'chars' characters of 'str'. */
std::string right(std::string const& str, std::size_t chars);

/** Determines if the given path is a directory. */
bool exists(char const* pathname);

/** Determines if the given path is a directory. */
bool dir_exists(char const* pathname);

/** Determines if the given path is a file. */
bool file_exists(char const* pathname);

/** Creates a new directory. */
int mkdir(char const* pathname/*, mode_t mode*/);

inline std::string left(std::string const& str, std::size_t chars)
{
	return str.substr(0, min(str.size(), chars));
}

inline std::string right(std::string const& str, std::size_t chars)
{
	return str.substr(str.size() - min(str.size(), chars));
}

bool
exists(char const* pathname)
{
#ifdef _WIN32
	struct _stat statbuf;
	if (::_stat(pathname, &statbuf) < 0)
		return false;
#else // _WIN32
	struct stat statbuf;
	if (::stat(pathname, &statbuf) < 0)
		return false;
#endif // _WIN32

	return true;
}

/* ---------------------------------------------------------------- */

bool
dir_exists(char const* pathname)
{
#ifdef _WIN32
	struct _stat statbuf;
	if (::_stat(pathname, &statbuf) < 0)
		return false;

	if (!(statbuf.st_mode & _S_IFDIR))
		return false;
#else // _WIN32
	struct stat statbuf;
	if (::stat(pathname, &statbuf) < 0)
		return false;

	if (!S_ISDIR(statbuf.st_mode))
		return false;
#endif // _WIN32
	return true;
}


/* ---------------------------------------------------------------- */

bool
file_exists(char const* pathname)
{
#ifdef _WIN32
	struct _stat statbuf;
	if (::_stat(pathname, &statbuf) < 0)
		return false;

	if (!(statbuf.st_mode & _S_IFREG))
		return false;
#else // _WIN32
	struct stat statbuf;
	if (::stat(pathname, &statbuf) < 0)
		return false;

	if (!S_ISREG(statbuf.st_mode))
		return false;
#endif // _WIN32

	return true;
}

int
mkdir(char const* pathname/*, mode_t mode*/)
{
#ifdef _WIN32
	if (::_mkdir(pathname) < 0)
		return 0;
#else // _WIN32
	if (::mkdir(pathname, S_IRWXU | S_IRGRP | S_IXGRP) < 0)
		return false;
#endif // _WIN32

	return 1;
}


void CreateDir(const char* dir)
{
	using namespace std;
	int m = 0, n;
	string str1, str2;
	str1 = dir;
	str2 = str1.substr(0, 2);
	str1 = str1.substr(3, str1.size());
	while (m >= 0)
	{
		m = str1.find('\\');

		str2 += '\\' + str1.substr(0, m);
		//判断该目录是否存在
		n = _access(str2.c_str(), 0);
		if (n == -1)
		{
			//创建目录文件
			_mkdir(str2.c_str());
		}

		str1 = str1.substr(m + 1, str1.size());
	}
}
相关推荐
2的n次方_5 分钟前
CANN Ascend C 编程语言深度解析:异构并行架构、显式存储层级与指令级精细化控制机制
c语言·开发语言·架构
iAkuya21 分钟前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
近津薪荼21 分钟前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck23 分钟前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl
松☆26 分钟前
CANN与大模型推理:在边缘端高效运行7B参数语言模型的实践指南
人工智能·算法·语言模型
_F_y28 分钟前
C++重点知识总结
java·jvm·c++
java干货37 分钟前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
_F_y37 分钟前
C语言重点知识总结(含KMP详细讲解)
c语言·开发语言
毕设源码-郭学长39 分钟前
【开题答辩全过程】以 基于python的二手房数据分析与可视化为例,包含答辩的问题和答案
开发语言·python·数据分析
皮皮哎哟1 小时前
数据结构:嵌入式常用排序与查找算法精讲
数据结构·算法·排序算法·二分查找·快速排序