• Qt之QTemporaryFile(文件名唯一,且可以自动删除)


    简述

    QTemporaryFile类是操作临时文件的I/O设备。

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

    详细描述

    例如:

    QTemporaryFile file;
    if (file.open()) {
        // file.fileName() 返回唯一的文件名
    }
    
    // QTemporaryFile析构,移除临时文件
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    临时文件的文件名可以通过调用fileName()获取。注意:在第一次打开后使用,在此之前返回空字符串。

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

    指定的文件名可以包含下列模板XXXXXX(6个大写的“X”字符),将由文件名的自动生成部分来代替。

    注意:模板是区分大小写的,如果模板中不存在文件名,QTemporaryFile会追加生成部分到给定的文件名。

    常用接口

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

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

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

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

    • 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
    • 1
    • 2
    • 3
    • 4
    • 5
    • QTemporaryFile * createNativeFile(const QString & fileName) 
      这是一个重载函数。

      适用于给定的文件名,而不是现有QFile对象。

    • bool open(OpenMode flags) 
      重新实现QIODevice::open()

      为临时文件创建一个唯一的文件名,并将其打开。然后通过调用fileName()来获得唯一的名称。

    示例

    // 设置模板名称
    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";
    }

    输出如下:

    tempPath : "C:/Users/Wang/AppData/Local/Temp" 
    fileTemplate : "C:/Users/zhaoxj/Wang/Local/Temp\TemporaryFile_XXXXXX.docx" 
    fileName : "C:/Users/Wang/AppData/Local/Temp/TemporaryFile_p22112.docx"

    这时,我们可以去指定的目录下查找对应的文件。

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

    http://blog.csdn.net/liang19890820/article/details/51820253

  • 相关阅读:
    Linux学习笔记之Linux Centos关闭防火墙
    ELK学习笔记之Logstash详解
    ELK学习笔记之ElasticSearch的索引详解
    C语言拼接字符串 -- 使用strcat()函数
    linux 中的 open() read() write() close() 函数
    stderr 和stdout
    ubuntu14.04 放开串口权限
    ubuntu14.04 安装 openssh-server
    串口接线
    ubuntu + usb转RS232驱动
  • 原文地址:https://www.cnblogs.com/findumars/p/5641979.html
Copyright © 2020-2023  润新知