当前位置: 首页 > news >正文

qt创建临时文件

1、临时文件系统

        在 Linux 系统中,创建临时文件系统很简单,执行如下指令即可:

mount -t tmpfs -o size=1024m tmpfs /mnt/tmp

        挂载成功后,在 /mnt/tmp 这个挂载点下创建的所有文件都将会是临时文件, 也就是说:当电脑关机之后,这些文件就消失了。

        这样做的好处是:不需要硬盘的 I/O 操作,读写速度都非常快!

2、QTemporaryFile类

        作用:创建临时文件,临时文件为输入文件路径+符号“.”+6个随机字符。

        QTemporaryFile用于安全地创建一个独一无二的临时文件。临时文件通过调用open()来创建,并且名称是唯一的(即:保证不覆盖现有文件),该临时文件将随着QTemporaryFile对象的析构被删除。这是一个重要的技术,避免了存储在临时文件的应用程序数据损坏。

2.1、使用示例

#include <QTemporaryFile>QTemporaryFile file;
if (file.open())
{// file.close();qDebug() << "tempPath:" << QDir::tempPath();qDebug() << "fileTemplate:" << file.fileTemplate();  // 获得模板路径qDebug() << "fileName:" << file.fileName(); // 获得唯一的名称
}

结果:

tempPath: "C:/Users/i/AppData/Local/Temp"
fileTemplate: "C:/Users/i/AppData/Local/Temp/project.XXXXXX"
fileName: "C:/Users/i/AppData/Local/Temp/project.qixEmr

        a)QTemporaryFile定义后,若未打开或打开失败,则file.fileName()返回空字符串;

        b)file.open()创建临时文件,若失败则为无权限或其它原因;

        c)在调用close()之后重新打开QTemporaryFile是安全的,只要临时文件对象还没有销毁,临时文件就一直存在并由QTemporaryFile内部保持打开;

        d)一个临时文件中会有一些静态的部分名称和唯一的计算部分。默认的文件名由QCoreApplication:applicationName()(否则qt_temp)来决定,被放置到QDir::tempPath()返回的临时路径中。如果指定了文件名,相对文件路径将不会被放置在默认的临时目录,但会相对于当前的工作目录;

        e)指定的文件名可以包含下列模板XXXXXX(6个大写的“X”字符),将由文件名的自动生成部分来代替,模板是区分大小写的,如果模板中不存在文件名,QTemporaryFile会追加生成部分到给定的文件名。

2.2、常用API介绍

        bool open() :// QTemporaryFile在QIODevice::ReadWrite(读写)模式下总是打开的,这方便访问文件中的数据。成功时返回true,将设置fileName()为唯一的文件名;

        bool open(OpenMode flags) : // 重新实现QIODevice::open(),为临时文件创建一个唯一的文件名,并将其打开。然后通过调用fileName()来获得唯一的名称;

        bool autoRemove() const :// 是否是自动删除模式。

        void setAutoRemove(bool b) : // 设置是否为自动删除模式。默认情况下,自动删除模式打开。

        QString fileTemplate() const :// 获取文件模板。

        void setFileTemplate(const QString & name) :// 设置文件模板。默认文件模板为qcoreappname.XXXXXX,被放置在QDir::tempPath()目录中。

        virtual QString fileName() const :// 重新实现QFileDevice::fileName(),获取完整的唯一文件名。在QTemporaryFile打开之前,返回值为空,之后将包含fileTemplate(),加上其它的字符使其唯一。

        QTemporaryFile * createNativeFile(QFile & file) :// 创建本地临时文件,如果文件不是本地文件,使用QDir::tempPath()创建一个QTemporaryFile,将文件的内容复制给它。如果文件是一个本地文件,返回0,什么都不做。

QFile f(":/resources/file.txt");
QTemporaryFile::createNativeFile(f); // 返回一个QTemporaryFile指针QFile f("/users/qt/file.txt");
QTemporaryFile::createNativeFile(f); // 返回0

        QTemporaryFile * createNativeFile(const QString & fileName) : // 这是一个重载函数,适用于给定的文件名,而不是现有QFile对象。

2.3、使用实例

// 设置模板名称
QString strFileName = QDir::tempPath() + QDir::separator() +QCoreApplication::applicationName() + "_XXXXXX." + "docx";
QTemporaryFile tmpFile(strFileName);// 设置为不自动删除
tmpFile.setAutoRemove(false);qDebug() << "tempPath : " << QDir::tempPath();if (tmpFile.open())
{tmpFile.close();QString strFileTemplate = tmpFile.fileTemplate();QString strFileName = tmpFile.fileName();qDebug() << "fileTemplate : " << strFileTemplate;qDebug() << "fileName : " << strFileName;// tmpFile.remove();
}
else
{qCritical() << "failed to write temporary file";
}

        注意:为了验证效果,我们使用了setAutoRemove(false),如果使用完需要删除临时文件,可以开启自动删除模:setAutoRemove(true),也可以手动删除:tmpFile.remove()。

3、自定义实现QTemporaryFile类

class CTest; // 声明class EnFile{public:EnFile() {};~EnFile() { release(); };void release() {if (QFile(mFilePath).exists())QFile(mFilePath).remove();mFilePath = "";};QString path() { return mFilePath; }private:QString mFilePath;void createCachePath() {mFilePath = QDir::cleanPath(QDir::tempPath() + QDir::separator() + "b331a2f5652bb73f.temp");QTemporaryFile tFile(mFilePath);if (!tFile.open()){QString cachePath = QDir::homePath() + "/.cache/";QDir dir(cachePath);if (!dir.exists())dir.mkdir(cachePath);mFilePath = QDir::cleanPath(cachePath + QDir::separator() + "b331a2f5652bb73f.temp");}};friend class CTest;
//友元类,操作createCachePath()函数
};

4、QTemporaryDir类

QTemporaryDir dir("logs");
if (dir.isValid())
{// dir.path() returns the unique directory pathqDebug() << "temp dir = " << dir.path();
}

1、Windows系统中,如何读写临时文件

Windows系统中,如何读写临时文件-51CTO.COM

2、Windows下CreateFile参数意义

如何使用CreateFile函数在Windows操作系统中创建新文件?-深圳春合晟辉

3、文件目录操作(QCoreApplication、QFile、QFileInfo、QDir、QTemporaryDir/File、QFileSystemWatcher)

Qt:42---文件目录操作(QCoreApplication、QFile、QFileInfo、QDir、QTemporaryDir/File、QFileSystemWatcher)_51CTO博客_qt 文件目录

http://www.lryc.cn/news/147520.html

相关文章:

  • Element——table排序,上移下移功能。及按钮上一条下一条功能
  • 无涯教程-Android - Linear Layout函数
  • ELK安装、部署、调试(六) logstash的安装和配置
  • 【Spring Security】UserDetails 接口介绍
  • C# Linq源码分析之Take(四)
  • Python 和 C++ 使用细节差别
  • 在Ubuntu Linux系统上安装RabbitMQ服务并解决公网远程访问问题
  • 葫芦娃自动预约-公众号代挂
  • ESP32应用教程(0)— PMW3901MB光流传感器
  • docker部署nginx,部署springboot项目,并实现访问
  • 十五、模板方法模式
  • jvm 什么是常量池,常量池定义 class常量池
  • CA证书颁发机构服务器
  • 5. 线性层及其他层
  • PhpStorm安装篇
  • 麒麟Linux常见问题
  • 一百六十八、Kettle——用海豚调度器定时调度从Kafka到HDFS的任务脚本(持续更新追踪、持续完善)
  • Linux centos7 bash编程(小练习)
  • 【SpringBoot】Web server failed to start. Port 8080 was already in use.
  • day-36 代码随想录算法训练营(19)part05
  • Vue3 实现JS动态改变CSS样式
  • 最新社区团购电商小程序源码 无bug完美运营版+详细搭建部署教程
  • 恒运资本:三大指数震荡走低,地产股大幅回撤,光刻胶概念逆市上涨
  • DP读书:不知道干什么就和我一起读书吧——以《鲲鹏处理器 架构与编程》中鲲鹏软件的构成为例
  • 现货黄金走势图中的止盈点
  • MyBatisPlus实现多租户功能
  • JAVA-斐波那契数列
  • keepalived+lvs(DR)
  • 基于Matlab实现频谱分析(附上源码+数据集)
  • 【Java】多线程(进阶)