使用QT将内容保存为文件到本地,并且可以自动清理(超时)旧文件
方案一
参数描述:
参数一filename表示直接定义好文件路径+文件名(/xxx/xxx/xxx/a.jpg);
参数二pSrcFrame表示需要被保存的数据,我这里使用AVFrame类型,你们使用时换成QImage或者string类型都是可以的。
bool SaveAsJPEG(string fileName, AVFrame * pSrcFrame)
{
if(fileName == "" || pSrcFrame == YNULL || pSrcFrame->format != AV_PIX_FMT_BGRA)
return false;
//截取出文件路径
int32_t position = fileName.find_last_of('/');
QString tmpFilePath = QString(fileName.substr(0, position).c_str());
if(tmpFilePath == "")
return false;
//直接创建目录
QDir dirPath(tmpFilePath);
if(!dirPath.exists(tmpFilePath))
dirPath.mkpath(tmpFilePath);
//获取目录下所有文件,全部清除
QFileInfoList fileList = dirPath.entryInfoList(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
for(auto iter = fileList.begin(); iter != fileList.end(); iter++)
iter->dir().remove(iter->fileName());
//保存图片
QImage image(pSrcFrame->data[0], pSrcFrame->width, pSrcFrame->height, QImage::Format_ARGB32);
image.save(QString::fromStdString(fileName),"JPG",100);
return true;
}
方案二
描述:
将文件的名字保存为“日期+时间”,之后使用轮询判断文件夹内部指定格式文件,如发现文件超过指定时间,则清理。
由于windows系统下,冒号":"会被识别成盘符(C: D:),所以命名"时分秒"我使用横杠符号"-";linux系统可以正常使用冒号命名;
windows系统下保存的文件名格式为:ordinary_20230320_18-33-29.779.txt(文件内容类型__ 日期 时间.txt)
linux系统下保存的文件名格式为:ordinary_20230320_18:33:29.779.txt(文件内容类型 日期 __时间.txt)
头文件:
SaveFile.h专门写了一个类,里面有4个公共函数接口:设置目录和超时时间、需要保存的内容、清理超时文件、释放对象;
#ifndef SAVEFILE_H
#define SAVEFILE_H
#include <QDir>
#include <QDateTime>
class SaveFile
{
public:
//构造函数初始化:保存文件的路径、保存内容的类型
SaveFile(QString savePath = QDir::currentPath(), QString ContentType = "ordinary");
public:
//设置目录及超时时间
void SetDirAndTime(QString dirName = "./", int timeOut = 0);
//保存文件
void SaveFileToLocal(QString strContent);
//清理文件
void ClearTimeOutFileToLocal();
//释放对象
void Release();
private:
QString m_strCurrentPath; //当前绝对路径
QString m_strDirName; //保存文件到哪个目录名
QString m_strContentType; //文件内容类型
int m_iTimeOut; //超时时间
};
#endif // SAVEFILE_H
函数实现:
SaveFile.cpp
//设置目录和超时时间(以秒为单位)
void SaveFile::SetDirAndTime(QString dirName, int timeOut)
{
m_strDirName = dirName;
m_iTimeOut = timeOut;
}
//保存文件接口,参数为传入文件内容
void SaveFile::SaveFileToLocal(QString strContent)
{
if(strContent == "")
return;
if(m_strDirName == "" || m_strCurrentPath == "" || m_strContentType == "")
return;
QDateTime curDateTime = QDateTime::currentDateTime();
#ifdef linux
QString curDate = curDateTime.toString("yyyyMMdd_hh:mm:ss.zzz");
#elif WIN32
//因为windows系统下会识别( : )为路径符号,所以更改为(-)
QString curDate = curDateTime.toString("yyyyMMdd_hh-mm-ss.zzz");
#endif
//初始化当前路径
QDir dir(m_strCurrentPath);
if(!dir.exists(m_strDirName))
dir.mkdir(m_strDirName);
dir.cd(m_strDirName);
//设置文件保存路径+名字(目录名/保存内容类型_当前时间.txt)
QString filePath = QString("%1/%2_%3.txt").arg(m_strDirName).arg(m_strContentType).arg(curDate);
QFile sFile(filePath);
if(!sFile.open(QIODevice::Truncate | QIODevice::WriteOnly|QIODevice::Text))
printf("Open jsonfile failed!\n");
sFile.write(strContent.toStdString().c_str());
sFile.close();
}
//清理超时文件
void SaveFile::ClearTimeOutFileToLocal()
{
if(m_iTimeOut <= 0 || m_strCurrentPath == "" || m_strDirName == "")
return;
QDateTime curDateTime = QDateTime::currentDateTime();
QDir dir(m_strCurrentPath);
if(!dir.exists(m_strDirName))
dir.mkdir(m_strDirName);
dir.cd(m_strDirName);
/********************************将本地文件提取到QT的文件列表里***********************************/
//获取当前目录下的所有普通文件、隐藏文件、非管道文件,存到QFile文件列表里
QFileInfoList fileList = dir.entryInfoList(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
for(auto iter = fileList.begin(); iter != fileList.end(); iter++)
{
QString tmpFileName = iter->fileName();
if(tmpFileName.contains(".txt") && tmpFileName.contains(m_strContentType))
{
//去除影响我判断时间的文件名字符串
QString tmpRemove = QString("%1_").arg(m_strContentType);
QString slitfileName = ((iter->fileName().remove(".txt")).remove(tmpRemove));
#ifdef linux
QDateTime oldTime(QDateTime::fromString(slitfileName,"yyyyMMdd_hh:mm:ss.zzz"));
#elif WIN32
QDateTime oldTime(QDateTime::fromString(slitfileName,"yyyyMMdd_hh-mm-ss.zzz"));
#endif
//拼接文件名(获取完日期时间后,文件名拼接回来,为接下来删除超时文件做准备)
slitfileName = (tmpRemove + slitfileName) + ".txt";
int timeDiff = curDateTime.toTime_t() - oldTime.toTime_t();
if(timeDiff > m_iTimeOut)
(*iter).dir().remove(slitfileName); //如果超时,则移除文件
}
}
}
//释放对象
void SaveFile::Release()
{
delete this;
}
具体使用
- 新建对象,并设置目录和超时清理时间(单位:秒)
#define JSON_DIRNAME "JsonMessage" //由于我保存的文件类型为json文件,所以我设置目录名字为JsonMessage
#define TIMOUT (60 * 5) //超时时间5分钟
SaveFile * m_pSaveJsonFile = new SaveFile();
m_pSaveJsonFile->SetDirAndTime(JSON_DIRNAME,TIMOUT);
- 释放对象
if(m_pSaveJsonFile)
{
m_pSaveJsonFile->Release();
m_pSaveJsonFile = nullptr;
}
- 保存文件
//参数为:指向内容的指针,可以是char*
m_pSaveJsonFile->SaveFileToLocal(QString(agentJson.toStyledString().c_str()));
- 清理超时文件
m_pSaveJsonFile->ClearTimeOutFileToLocal();
希望能写明白,感谢包容!