QTemporaryDir及QTemporaryFile

//输出用户指定的文件名。

//随机数始终存在,只不过在文件名中的表现位置不同:zzz.txt.sdUwcr

QString tmpFullfileName =QCoreApplication::applicationDirPath()+QDir::separator()+"zzz.txt";

         

//输出应用程序文件名 + 6位不重复的随机数( ?)

QString tmpname = QDir::homePath()+QDir::separator()+QCoreApplication::applicationName()+"_XXXXXX."+"txt";

    //QTemporaryFile示例
    QString tmpname = QDir::homePath() + QDir::separator() + QCoreApplication::applicationName() + "_XXXXXX." + "txt";
    QTemporaryFile tmpFile(tmpname);

————————————————
版权声明:本文为CSDN博主「luoyayun361」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/luoyayun361/article/details/80371302

    //QTemporaryFile示例
    QString tmpFullfileName =QCoreApplication::applicationDirPath()+QDir::separator()+"zzz.txt";
    QTemporaryFile tmpFullFile(tmpFullfileName);

    if(tmpFullFile.open()){
        qDebug() << "tmpFullFile 11: " << tmpFullFile.fileTemplate(); //zzz.txt
        qDebug() << "tmpFullFile 22: " << tmpFullFile.fileName(); //zzz.txt.JRqQNT
    }


    QString tmpname = QDir::homePath()+QDir::separator()+QCoreApplication::applicationName()+"_XXXXXX."+"txt";
    QTemporaryFile tmpFile(tmpname);
    tmpFile.setAutoRemove(false);

    if(tmpFile.open()){
        qDebug() << __FUNCTION__ << tmpFile.fileTemplate(); //untitled_XXXXXX.txt
        qDebug() << __FUNCTION__ << tmpFile.fileName(); //untitled_pdxIpM.txt
    }

    QFile f(tmpFile.fileName());
    bool ok = QTemporaryFile::createNativeFile(f);//如果文件存在,返回 false
    qDebug() << __FUNCTION__ << ok;

    // tmpFile.remove();

Qt 之QTemporaryFile用法(创建临时文件)_luoyayun361的博客-CSDN博客

介绍

两者都是在构造时创建一个随机名称的目录或文件,并在其销毁时自动删除对应的目录和文件,同时两者均能保证不会覆盖已有文件。

实例化时若不传递参数则随机确定名称,若传入名称会优先尝试指定名称若此名称已存在文件则会随机创建。

file的父类是QFile,可以进行QFile的所有操作。
但要注意Dir的父类只是QObject并不是QDir,也很正常,毕竟只是个临时文件夹不需要其他操作。


QTemporaryDir

概述

在 Qt 开发中,有时候会要创建一个临时目录,用于存储一些临时文件,在用完过后又要删除该目录,这个逻辑自己实现起来并不复杂,多写几行代码就搞定了,但是这里要说的是更简单的用法QTemporaryDir

QTemporaryDir用于安全地创建唯一的临时目录目录本身是由构造函数创建的临时目录的名称保证是唯一的(即保证不覆盖现有目录),并且在销毁QTemporaryDir对象后,该目录随后将被删除

目录名称是自动生成的,或者是基于模板创建的,该模板被传递给QTemporaryDir的构造函数。
————————————————
原文链接:https://blog.csdn.net/luoyayun361/article/details/80359046

接口说明

    QTemporaryDir()
    QTemporaryDir(const QString &templatePath)
    ~QTemporaryDir()
    bool autoRemove() const
    QString errorString() const
    QString filePath(const QString &fileName) const
    bool isValid() const
    QString path() const
    bool remove()
    void setAutoRemove(bool b)

注意构造函数说明,支持相对路径:

    If templatePath is a relative path, the path will be relative to the current working directory.

同时注意对于路径末尾字符的说明,文件夹路径会直接在指定路径之后添加随机字符,如果指定路径最后不是/则为指定名称+XXX构成新路径名,如果最后是/则在前面的路径后新建一个随机目录,注意此时必须保证前面的文件夹都存在否则出错,见后面的范例:

    If the templatePath ends with XXXXXX it will be used as the dynamic portion of the directory name, otherwise it will be appended. Unlike QTemporaryFile, XXXXXX in the middle of the template string is not supported.

remove可以主动提前删除目录,注意会删除目录下所有文件,毕竟是临时目录不要存有用的东西

    Removes the temporary directory, including all its contents.

autoremove默认是true

最后,filePath可以获取文件的路径名,这个比较特殊,需要传入一个文件名,此函数返回一个完整的路径名。这样可以用于后续的QTemporaryFile。


范例

#include <QCoreApplication>
#include <QDebug>
#include <QTemporaryFile>
#include <QTemporaryDir>
int main(int argc, char *argv[]) {
    QCoreApplication a(argc,argv);

    QTemporaryDir testdir1;
    qDebug()<<testdir1.autoRemove();
    qDebug()<<testdir1.filePath("123.txt");

    QTemporaryDir testdir2("testdir2");
    qDebug()<<testdir2.autoRemove();
    qDebug()<<testdir2.filePath("123.txt");

    QTemporaryDir testdir3("testdir3/");
    //注意这样等于是指定在当前运行目录下的testdir3目录下建立一个随机名称的目录
    //如果testdir3文件夹不存在将会出错
    qDebug()<<testdir3.autoRemove();
    qDebug()<<testdir3.filePath("123.txt");
    return 0;
}

结果

    true
    "C:/Users/XXXXXX/AppData/Local/Temp/untitled-GN2aKw/123.txt"
    true
    "testdir2bE7tFd/123.txt"
    true
    "testdir3/zxPK5t/123.txt"

XXXXXX是当前系统登录的用户名,也就是默认目录自动指向了系统默认的临时文件地址。

    最后的testdir3目录下建立临时目录,最后删除的只是临时目录及其下所有文件,并不会删除testdir3文件夹

================================

QTemporaryFile

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

QTemporaryFile用于安全地创建一个独一无二的临时文件

临时文件通过调用open()来创建,并且名称是唯一的(即:保证不覆盖现有文件),该临时文件将随着QTemporaryFile对象的析构被删除

这是一个重要的技术,避免了存储在临时文件的应用程序数据损坏。文件名可以自动生成,也可以基于模板(传参至QTemporaryFile的构造函数)创建。
 

接口说明

    QTemporaryFile()
    QTemporaryFile(const QString &templateName)
    QTemporaryFile(QObject *parent)
    QTemporaryFile(const QString &templateName, QObject *parent)
    ~QTemporaryFile()
    bool autoRemove() const
    QString fileTemplate() const
    bool open()
    void setAutoRemove(bool b)
    void setFileTemplate(const QString &name)

构造函数可以传入一个临时文件名,这个名称就可以用QTemporaryDir::filePath实现在临时目录建立一个指定文件名的临时文件。(如果这个文件已经存在那么还是会建立一个随机名称的)

fileTemplate是文件名,临时文件的实现原理是文件名后面加上一个”.XXX”随机名称,所以前面的文件名可以随机指定


范例

#include <QCoreApplication>
#include <QDebug>
#include <QTemporaryFile>
#include <QTemporaryDir>
int main(int argc, char *argv[]) {
    QCoreApplication a(argc,argv);

    QTemporaryFile testfile1;//建立第一个文件
    qDebug()<<"testfile1"<<testfile1.fileName()
           <<testfile1.fileTemplate();

    //第一次open之前文件是没有建立的,所以没名字
    testfile1.open();
    testfile1.close();

    qDebug()<<"testfile1"<<testfile1.fileName()
           <<testfile1.fileTemplate();

    //只要对象不被销毁,可以重复open,不会变文件
    testfile1.open();
    qDebug()<<"testfile1"<<testfile1.fileName()
           <<testfile1.fileTemplate();

    //指定名字
    QTemporaryFile testfile2("testfile2");
    testfile2.open();
    qDebug()<<"testfile2"<<testfile2.fileName()
           <<testfile2.fileTemplate();

    //建立一个重名的
    QTemporaryFile testfile3("testfile2");
    testfile3.open();
    qDebug()<<"testfile3"<<testfile3.fileName()
           <<testfile3.fileTemplate();

    //在QTemporaryDir临时目录下建立一个
    QTemporaryDir testdir1;
    qDebug()<<"testdir1"<<testdir1.filePath("testfile4.txt");

    QTemporaryFile testfile4(testdir1.filePath("testfile4.txt"));
    testfile4.open();
    qDebug()<<"testfile4"<<testfile4.fileName()
           <<testfile4.fileTemplate();

    //注意最后一个就算文件名定义了txt后缀,夜壶自动在后面加.xxxxxx
    //QTemporaryFile继承了QFile,在open以后可以直接进行QFile的所有操作
    return 0;
}

结果

    //第一次open之前文件是没有建立的,所以没名字

    testfile1 "" "C:/Users/XXXXX/AppData/Local/Temp/untitled.XXXXXX"

                 
    testfile1 "C:/Users/XXXXX/AppData/Local/Temp/untitled.Hp9316" "C:/Users/zhouliang/AppData/Local/Temp/untitled.XXXXXX"

         

    //只要对象不被销毁,可以重复open,不会变文件
    testfile1 "C:/Users/XXXXX/AppData/Local/Temp/untitled.Hp9316" "C:/Users/zhouliang/AppData/Local/Temp/untitled.XXXXXX"

        

    //指定名字
    testfile2 "D:/my_program_design/untitled/build-untitled-Desktop_Qt_5_9_2_MinGW_32bit-Debug/testfile2.gq9316" "testfile2"

        

    //建立一个重名的
    testfile3 "D:/my_program_design/untitled/build-untitled-Desktop_Qt_5_9_2_MinGW_32bit-Debug/testfile2.Uh9316" "testfile2"

        

    //在QTemporaryDir临时目录下建立一个
    testdir1 "C:/Users/XXXXX/AppData/Local/Temp/untitled-i9GN2a/testfile4.txt"

        
    testfile4 "C:/Users/XXXXX/AppData/Local/Temp/untitled-i9GN2a/testfile4.txt.lY9316" "C:/Users/zhouliang/AppData/Local/Temp/untitled-i9GN2a/testfile4.txt"

file的父类是QFile,可以进行QFile的所有操作。上述范例没有演示读写操作。


————————————————
版权声明:本文为CSDN博主「Qt开发老杰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/QtCompany/article/details/129014369

参考:

Qt之QTemporaryDir用法(创建临时目录)_luoyayun361的博客-CSDN博客

Qt 之QTemporaryFile用法(创建临时文件)_luoyayun361的博客-CSDN博客

使用QTemporaryFile判断目标路径是否可写_qt判断目录可写_wangw8507的博客-CSDN博客

QTemporaryDir及QTemporaryFile_Qt开发老杰的博客-CSDN博客

Qt学习笔记之QTemporaryFile_浩瀚之水_csdn的博客-CSDN博客

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值