#pragma once
#include <iostream>
#include <io.h>
#include <direct.h>
#include <time.h>
#include <string>
#include <vector>
#include <windows.h>
using namespace std;
//读取某给定路径下所有文件夹与文件名称,并带完整路径
static void getAllFilesInDirs(string path, vector<string>& fileFullpath) {
_finddata_t fileInfo;
//将string转化为const char*类型
string path1 = path + "\\*.*";
intptr_t fileHandle = _findfirst(path1.c_str(), &fileInfo);
//读取第一个文件信息 文件句柄类型为long会出现不兼容[Win10平台用long声明文件句柄会crash]
string f;
if (fileHandle == -1) {
cout << "error\n";
return;
}
while (_findnext(fileHandle, &fileInfo) == 0) {
if (fileInfo.attrib & _A_SUBDIR) {
if (strcmp(fileInfo.name, ".") == 0 || strcmp(fileInfo.name, "..") == 0) continue;
string newPath = path + "\\" + fileInfo.name;
getAllFilesInDirs(newPath, fileFullpath);
}
else {
f = path + string("\\") + string(fileInfo.name);
fileFullpath.push_back(f);
}
};
_findclose(fileHandle);
}
// 获取文件后缀名
static string getExtension(string filename) {
return filename.substr(filename.find_last_of('.'));
}
// 获取文件名,不包含目录
static string getFilename(string file_fullpath) {
return file_fullpath.substr(file_fullpath.find_last_of('\\') + 1);
}
//获取文件名,不包含目录和后缀名
static string getFilenameNoExt(string filename) {
filename = getFilename(filename);
return filename.substr(0, filename.find_last_of('.'));
}
////读取某给定路径下后缀名为format得文件名称,并带完整路径
static void getAllFilesByformat(string path, vector<string>& fileFullpath, string format) {
_finddata_t fileInfo;
//将string转化为const char*类型
string path1 = path + "\\*.*";
intptr_t fileHandle = _findfirst(path1.c_str(), &fileInfo);
//读取第一个文件信息 文件句柄类型为long会出现不兼容[Win10平台用long声明文件句柄会crash]
string f;
if (fileHandle == -1) {
cout << "error\n";
return;
}
while (_findnext(fileHandle, &fileInfo) == 0) {
if (fileInfo.attrib & _A_SUBDIR) {
if (strcmp(fileInfo.name, ".") == 0 || strcmp(fileInfo.name, "..") == 0) continue;
string newPath = path + "\\" + fileInfo.name;
getAllFilesByformat(newPath, fileFullpath, format);
}
else {
if (getExtension(fileInfo.name) == format)
{
f.clear();
f = path + string("\\") + string(fileInfo.name);
fileFullpath.push_back(f);
}
}
};
_findclose(fileHandle);
}
// 字符串分割到 vector
static vector<string> string_split(const string& str, const string& delim) {
vector<string> res;
if ("" == str) return res;
//先将要切割的字符串从string类型转换为char*类型
char * strs = new char[str.length() + 1]; //不要忘了
strcpy(strs, str.c_str());
char * d = new char[delim.length() + 1];
strcpy(d, delim.c_str());
char *p = strtok(strs, d);
while (p) {
string s = p; //分割得到的字符串转换为string类型
res.push_back(s); //存入结果数组
p = strtok(NULL, d);
}
return res;
}
// 递归创建文件夹
static int self_mkdirs(string filename) {
filename += "\\";
char *fileName = (char*)filename.c_str();
char *tag;
int a = 0;
for (tag = fileName; *tag; tag++, a++)
{
if (*tag == '\\')
{
string new_path = filename.substr(0, a + 1);
if (_access(new_path.c_str(), 0) == -1) //如果文件夹不存在
_mkdir(new_path.c_str()); //则创建
}
}
return 0;
}
// 文件是否存在
static bool exist_file(string filename) {
return _access(filename.c_str(), 4) == 0;
}
// 打乱vector
static vector<string> vector_shuffle(vector<string> v1) {
vector<string> v2;
// 复制
v2.assign(v1.begin(), v1.end());
//打乱
random_shuffle(v2.begin(), v2.end());
return v2;
}
///替换指定字符串
static string replace_all(string str, const string& old_value, const string& new_value)
{
string str1 = "";
while (true) {
string::size_type pos(0);
if ((pos = str.find(old_value)) != string::npos)
str1 = str.replace(pos, old_value.length(), new_value);
else break;
}
return str1;
}
static std::string GetTime() {
time_t timep;
time(&timep);
char tmp[64];
strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S", localtime(&timep));
return tmp;
}