方法一
参数描述
- filename:表示直接定义好文件路径+文件名(/xxx/xxx/xxx/a.jpg);
- pSrcFrame:表示需要被保存的数据,这里使用AVFrame参数类型;
代码实现
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
- linux保存文件名格式:ordinary_20230320_18:33:29.779.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;
}
2714

被折叠的 条评论
为什么被折叠?



