QT保存数据到本地,并自动清理(超时)文件

方法一

参数描述

  • 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值