zoukankan      html  css  js  c++  java
  • Qt之QTemporaryFile

    简述

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

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

    详细描述

    例如:

    QTemporaryFile file;
    if (file.open()) {
        // file.fileName() 返回唯一的文件名
    }
    
    // QTemporaryFile析构,移除临时文件

    在调用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
    • 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()。

  • 相关阅读:
    MySQL 练习题
    MySQL 增删查改
    HTML显示与隐藏
    360布局
    div布局
    HTML练习2
    HTML练习

    if语句的用法及其案例
    输入输出,数据类型与运算符
  • 原文地址:https://www.cnblogs.com/itrena/p/5938291.html
Copyright © 2011-2022 走看看