parent
388cd36ea3
commit
8593e137dd
@ -1,202 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <iostream>
|
|
||||||
#include <vector>
|
|
||||||
#include <fstream>
|
|
||||||
#include <atomic>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <string>
|
|
||||||
#include <sstream>
|
|
||||||
#include <boost/algorithm/string.hpp>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
#include "../comm/Log.hpp"
|
|
||||||
|
|
||||||
namespace ns_util
|
|
||||||
{
|
|
||||||
// 公共编译路径
|
|
||||||
const std::string defaultTempPath = "./temp/";
|
|
||||||
|
|
||||||
// 给文件名加路径和后缀
|
|
||||||
class pathUtil
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
pathUtil()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
~pathUtil()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// 给要文件添加后缀,路径
|
|
||||||
static std::string addSuffix(const std::string &file_name, const std::string &suffix)
|
|
||||||
{
|
|
||||||
return defaultTempPath + file_name + suffix;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 程序编译时的三个临时文件
|
|
||||||
// 生成源文件
|
|
||||||
static std::string src(const std::string &file_name)
|
|
||||||
{
|
|
||||||
return addSuffix(file_name, ".cpp");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 生成可执行文件
|
|
||||||
static std::string exe(const std::string &file_name)
|
|
||||||
{
|
|
||||||
return addSuffix(file_name, ".exe");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 生成编译错误的完整文件名
|
|
||||||
static std::string compilerError(const std::string &file_name)
|
|
||||||
{
|
|
||||||
return addSuffix(file_name, ".compile_error");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 程序运行时的三个临时文件
|
|
||||||
// 生成标准输入的完整文件名(标准输入所在路径+后缀)(这个地方函数名必须大写,否则命名冲突)
|
|
||||||
static std::string Stdin(const std::string &file_name)
|
|
||||||
{
|
|
||||||
return addSuffix(file_name, ".stdin");
|
|
||||||
}
|
|
||||||
// 生成标准输出的完整文件名(标准输出所在路径+后缀)
|
|
||||||
static std::string Stdout(const std::string &file_name)
|
|
||||||
{
|
|
||||||
return addSuffix(file_name, ".stdout");
|
|
||||||
}
|
|
||||||
// 生成标准错误的完整文件名(标准错误所在路径+后缀)
|
|
||||||
static std::string Stderr(const std::string &file_name)
|
|
||||||
{
|
|
||||||
return addSuffix(file_name, ".stderr");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// 判断文件是否存在
|
|
||||||
class fileUtil
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
fileUtil()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
~fileUtil()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
static bool isFileExist(const std::string &file_name)
|
|
||||||
{
|
|
||||||
struct stat buffer;
|
|
||||||
return (stat(file_name.c_str(), &buffer) == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// keep表示是否需要\n换行符
|
|
||||||
static bool readFile(const std::string &file_name, std::string *input, bool keep = false)
|
|
||||||
{
|
|
||||||
input->clear();
|
|
||||||
|
|
||||||
std::ifstream in(file_name);
|
|
||||||
if (!in.is_open())
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string line;
|
|
||||||
|
|
||||||
while (getline(in, line))
|
|
||||||
{
|
|
||||||
*input += line;
|
|
||||||
*input += (keep ? "\n" : "");
|
|
||||||
}
|
|
||||||
|
|
||||||
in.close();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool writeFile(const std::string &file_name, const std::string &output)
|
|
||||||
{
|
|
||||||
std::ofstream out(file_name);
|
|
||||||
if (!out.is_open())
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
out.write(output.c_str(), output.size());
|
|
||||||
out.close();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class TimeUtil
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
// 获取时间戳(秒级)
|
|
||||||
static std::string GetTimeStamp()
|
|
||||||
{
|
|
||||||
struct timeval _time;
|
|
||||||
gettimeofday(&_time, nullptr);
|
|
||||||
return std::to_string(_time.tv_sec); // 累积到现在的秒数
|
|
||||||
}
|
|
||||||
// 获取时间戳(毫秒级)
|
|
||||||
static std::string GetTimeMs()
|
|
||||||
{
|
|
||||||
struct timeval _time;
|
|
||||||
gettimeofday(&_time, nullptr);
|
|
||||||
return std::to_string(_time.tv_sec * 1000 + _time.tv_usec / 1000);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// 生成唯一的文件名
|
|
||||||
class nameUtil
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
nameUtil()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
~nameUtil()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
static std::string getUniqueName()
|
|
||||||
{
|
|
||||||
static std::atomic_uint id(0); // atomic是C++提供的原子性计数器
|
|
||||||
id++;
|
|
||||||
std::string ms = TimeUtil::GetTimeMs();
|
|
||||||
std::string uniq_id = to_string(id);
|
|
||||||
return ms + "-" + uniq_id;
|
|
||||||
// // 获取当前时间戳
|
|
||||||
// auto now = std::chrono::system_clock::now();
|
|
||||||
// auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count();
|
|
||||||
|
|
||||||
// // 使用随机数生成器
|
|
||||||
// std::random_device rd; // 非确定性随机数生成器
|
|
||||||
// std::mt19937 gen(rd()); // 使用Mersenne Twister算法的伪随机数生成器
|
|
||||||
// std::uniform_int_distribution<> dis(1000, 9999);
|
|
||||||
|
|
||||||
// // 生成唯一的文件名
|
|
||||||
// std::stringstream ss;
|
|
||||||
// ss << millis;
|
|
||||||
// ss << "_";
|
|
||||||
// ss << dis(gen); // 添加一个随机数来进一步确保唯一性
|
|
||||||
|
|
||||||
// return ss.str();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// 切分字符串工具
|
|
||||||
class splitUtil
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
splitUtil()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
~splitUtil()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
static void splitString(const std::string& src, const std::string& sep, std::vector<std::string>* tokens)
|
|
||||||
{
|
|
||||||
tokens->clear();
|
|
||||||
boost::split(*tokens, src, boost::is_any_of(sep), boost::algorithm::token_compress_on);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
Loading…
Reference in new issue