使用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();

希望能写明白,感谢包容!

posted @ 2023-03-20 18:52  程序员没有头发  阅读(873)  评论(0编辑  收藏  举报