Files
ds-628/BaseModules/Hd_LogicDll_module/toolkit.cpp
T
2025-07-29 19:56:39 +08:00

407 lines
12 KiB
C++

/*###############################################
* 常用函数集合
*
*
*
*
* ############################################*/
#include "toolkit.h"
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QThread>
#include <QDebug>
#include <windows.h>
#include <QDirIterator>
#include <QTextCodec>
bool isDirExist(const QString & fullDirName, bool Crt)
{
QDir photo;
bool exist = photo.exists(fullDirName);
if (exist)
{
return true;
//qDebug() << fullDirName << QString::fromLocal8Bit("::已存在");
}
else
{
//创建文件夹
if(Crt)photo.mkdir(fullDirName);
//qDebug() << fullDirName << QString::fromLocal8Bit("::不存在,创建");
}
return false;
}
bool isFileExist(const QString & fullFileName, bool Crt)
{
QFile file(fullFileName);
if (file.exists())
{
//qDebug() << fullFileName << QString::fromLocal8Bit("::已存在");
return true;
}
if(Crt){
if(file.open(QIODevice::WriteOnly)){
//WriteOnly或ReadWrite当文件不存在时创建
file.flush();
file.close();
//qDebug() << fullFileName << QString::fromLocal8Bit("::已创建");
};
}
return false;
}
QString createMultipleFoldes(const QString &fullDirName)
{
QString path=QDir::fromNativeSeparators(fullDirName);// 将\\转/
QDir dir(path);
if(dir.exists()){
return dir.absolutePath();
}
QString parent=createMultipleFoldes(path.mid(0,path.lastIndexOf("/")));
QString dirName=path.mid(path.lastIndexOf("/")+1);
QDir parentPath(parent);
if(!dirName.isEmpty()){
parentPath.mkpath(dirName);
}
return parent+"/"+dirName;
}
QString GetTimeStamp(QString Stamp)
{
QDateTime time = QDateTime::currentDateTime();
QString times = time.toString(Stamp);
return times;
}
bool QSetFileTimes(const QString & filepath, QDateTime& CreationTime)
{
bool fing=true;
if(!isFileExist(filepath))return false;
#if (QT_VERSION<QT_VERSION_CHECK(5,10,0))
HANDLE hFile;
//可输入中文路径
hFile=CreateFileW(filepath.toStdWString().data(),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile!=NULL){
FILETIME lpCreationTime; // 文件夹的创建时间
// FILETIME lpLastAccessTime; // 对文件夹的最近访问时间
// FILETIME lpLastWriteTime; // 文件夹的最近修改时间
// int i=GetFileTime (hFile, &lpCreationTime, &lpLastAccessTime, &lpLastWriteTime); // 获取文件夹时间属性信息
// SYSTEMTIME stc;
// FILETIME localTime;
// FileTimeToLocalFileTime(&lpCreationTime,&localTime);
// FileTimeToSystemTime(&localTime,&stc);//UTC转本地时间
SYSTEMTIME newDay;
newDay.wDayOfWeek=CreationTime.date().dayOfWeek();
newDay.wMonth=CreationTime.date().month();
newDay.wDay=CreationTime.date().day();
newDay.wYear=CreationTime.date().year();
newDay.wHour=CreationTime.time().hour();
newDay.wMinute=CreationTime.time().minute();
newDay.wSecond=CreationTime.time().second();
newDay.wMilliseconds=CreationTime.time().msec();
SystemTimeToFileTime(&newDay,&lpCreationTime);
fing&=SetFileTime(hFile,&lpCreationTime,&lpCreationTime,&lpCreationTime);//输入UTC格式
CloseHandle(hFile);//关闭句柄
}
#else
QFile file(filepath);
if(file.open(QIODevice::ReadWrite)){
fing&=file.setFileTime(CreationTime,QFileDevice::FileBirthTime);
fing&=file.setFileTime(CreationTime,QFileDevice::FileAccessTime);
fing&=file.setFileTime(CreationTime,QFileDevice::FileModificationTime);
file.close();
}else{
fing=false;
};
#endif
return fing;
}
int QGetRandom(int max, int min, bool timeC)
{
if(max-min<1)return -1;
//秒级随机种子
//qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
if(timeC)QThread::msleep(1);
//毫秒级随机种子
QTime time= QTime::currentTime();
qsrand(time.msec()+time.second()*1000);
return min+qrand()%abs(max-min);
}
void deleteDirectory(const QString &fullFileName)
{
QDir dir(fullFileName);
if (!dir.exists()) {
return;
}
dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
QFileInfoList fileList = dir.entryInfoList();
foreach (QFileInfo fi, fileList) {
if (fi.isFile()) {
fi.dir().remove(fi.fileName());
} else {
deleteDirectory(fi.absoluteFilePath());
dir.rmdir(fi.absoluteFilePath());
}
}
}
QStringList addNextDirectory(const QString &fullFileName, bool isDir,QString suffix)
{
// 判断路径是否存在
QDir dir(fullFileName);
if(!dir.exists())
{
return QStringList();
}
dir.setFilter(QDir::Dirs | QDir::NoSymLinks);
QFileInfoList list = dir.entryInfoList();
int file_count = list.count();
if(file_count <= 0)
{
return QStringList();
}
QStringList string_list;
for(int i=0; i<file_count; i++)
{
QFileInfo file_info = list.at(i);
if(file_info.fileName()=="."|file_info.fileName()=="..")continue;
if(isDir){
if(file_info.isDir()){
QString absolute_file_path = file_info.absoluteFilePath();
string_list.append(absolute_file_path);
}
}else{
if(!suffix.isEmpty()){
if(QString::compare(file_info.suffix(), QString(suffix), Qt::CaseInsensitive) != 0)
continue;
}
QString absolute_file_path = file_info.absoluteFilePath();
string_list.append(absolute_file_path);
}
}
return string_list;
}
QStringList addSubFolderDirectory(const QString &fullFileName, QStringList filters)
{
// 判断路径是否存在
QDir dir(fullFileName);
if(!dir.exists())
{
return QStringList();
}
// 定义迭代器并设置过滤器
QDirIterator dir_iterator(fullFileName,
filters,
QDir::Files | QDir::NoSymLinks,
QDirIterator::Subdirectories);
QStringList string_list;
while(dir_iterator.hasNext())
{
dir_iterator.next();
QFileInfo file_info = dir_iterator.fileInfo();
QString absolute_file_path = file_info.absoluteFilePath();
string_list.append(absolute_file_path);
}
return string_list;
}
void getAllFiles(std::string path, std::vector<std::string> &files, std::string format)
{
intptr_t hFile = 0;//文件句柄
struct _finddata_t fileinfo;//文件信息
std::string p;
if ((hFile = _findfirst(p.assign(path).append("\\*" + format).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)); //保存文件夹名
getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files, format); //递归遍历文件夹
}
}
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));//如果不是文件夹,储存文件名
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
QJsonObject loadJsonCfg(const QString path)
{
QJsonObject json_object;
try
{
QJsonParseError jsonError;
QString json_cfg = path;
if (json_cfg.isEmpty())
{
qCritical() << " [error] " << __FUNCTION__ << " line:" << __LINE__ << " JsonPath is null!";
return json_object;
}
QFile JsonFile;
JsonFile.setFileName(json_cfg);
JsonFile.open(QIODevice::ReadOnly);
QByteArray m_Byte = JsonFile.readAll();
if (m_Byte.isEmpty())
{
qDebug() << __FUNCTION__ << " line:" << __LINE__ << json_cfg + " Content is empty";
JsonFile.close();
return json_object;
}
QJsonDocument jsonDocument(QJsonDocument::fromJson(m_Byte, &jsonError));
if (!jsonDocument.isNull() && jsonError.error == QJsonParseError::NoError)
{
if (jsonDocument.isObject())
{
json_object = jsonDocument.object();
return json_object;
}
}
else
{
qCritical() << " [error] " << __FUNCTION__ << " line:" << __LINE__ << json_cfg + " is error!";
}
JsonFile.close();
}
catch (QString ev)
{
qCritical() << " [error] " << __FUNCTION__ << " line:" << __LINE__ << " ev:" << ev;
}
return json_object;
}
QStringList ReadTextCfg(const QString path)
{
QString csvpath = path;
// 读取每日csv
QStringList lines; //配置信息列表
QFile configFile;
configFile.setFileName(csvpath);
bool isTxT = false;
if (path.indexOf(".txt") != -1)isTxT = true;
if (configFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream stream_text(&configFile);
stream_text.setCodec(QTextCodec::codecForName("utf-8"));
// //可读取中文
stream_text.seek(0);
while (!stream_text.atEnd())
{
lines.push_back(gb2312ToUtf8(stream_text.readLine()));
}
}
else {
qDebug() << "read csv " << csvpath << " failed!" << endl;
}
configFile.close();
return lines;
}
bool WriteTXTCfg(const QStringList& parm,const QString path) {
QString fileName = path;
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return false;
//用文本流读取文件
QTextStream stream(&file);
//转换为字符串
for each (auto var in parm) {
//写入文本流
stream << var << endl;
}
//关闭文件
file.close();
return true;
}
EncodingFormat FileCharacterEncoding(const QString& fileName)
{
//假定默认编码utf8
EncodingFormat code = EncodingFormat::UTF8;
QFile file(fileName);
if (file.open(QIODevice::ReadOnly))
{
//读取3字节用于判断
QByteArray buffer = file.read(3);
quint8 sz1st = buffer.at(0);
quint8 sz2nd = buffer.at(1);
quint8 sz3rd = buffer.at(2);
if (sz1st == 0xFF && sz2nd == 0xFE)
{
code = EncodingFormat::UTF16LE;
}
else if (sz1st == 0xFE && sz2nd == 0xFF)
{
code = EncodingFormat::UTF16BE;
}
else if (sz1st == 0xEF && sz2nd == 0xBB && sz3rd == 0xBF)
{
code = EncodingFormat::UTF8BOM;
}
else
{
//尝试用utf8转换,如果无效字符数大于0,则表示是ansi编码
QTextCodec::ConverterState cs;
QTextCodec* tc = QTextCodec::codecForName("utf-8");
tc->toUnicode(buffer.constData(), buffer.size(), &cs);
code = (cs.invalidChars > 0) ? EncodingFormat::ANSI : EncodingFormat::UTF8;
}
file.close();
}
return code;
}
QString gb2312ToUtf8(const QString strUtf8)
{
//printf("~~~~ utf8 str is:%s\n", strUtf8);
QTextCodec* utf8Codec = QTextCodec::codecForName("utf-8");
QTextCodec* gb2312Codec = QTextCodec::codecForName("gb2312");
QString strUnicode = gb2312Codec->toUnicode(strUtf8.toLocal8Bit().data());
QByteArray ByteUtf8 = utf8Codec->fromUnicode(strUnicode);
return ByteUtf8;
}