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()。

Qt中利用FFmpeg进行视频格式转换,通常需要借助外部命令行工具,因为FFmpeg是一个跨平台的命令行工具,而Qt本身并不直接提供FFmpeg的内建支持。以下是一个基本的步骤: 1. **下载和安装FFmpeg**: 首先,在你的系统上安装FFmpeg,可以从其官方网站下载适用于你的系统的版本。安装完成后,确认FFmpeg命令可以在终端或命令提示符下运行。 2. **添加FFmpeg到PATH**: 将FFmpeg的bin目录添加到系统的PATH环境变量中,这样你就可以在命令行里直接使用FFmpeg命令。 3. **创建临时文件**: 在Qt中,你需要创建一个临时文件用于存储FFmpeg的输入和输出。可以使用QTemporaryFile来创建这个文件。 ```cpp QTemporaryFile tempInputFile(QStringLiteral("input.yuv")); tempInputFile.setAutoRemove(true); QTemporaryFile tempOutputFile(QStringLiteral("output.rgb")); tempOutputFile.setAutoRemove(true); ``` 4. **编写命令行调用FFmpeg**: 使用QProcess或QSystemProcess来执行FFmpeg命令。这里是一个例子,假设你想要将YUV转为RGB,转换命令可能是这样的: ```cpp QString ffmpegCommand = QStringLiteral("ffmpeg -i '%1' -pix_fmt rgb24 '%2'") .arg(tempInputFile.fileName()) .arg(tempOutputFile.fileName()); QProcess ffmpegProcess; ffmpegProcess.start(ffmpegCommand.toStdString().c_str(), nullptr); if (!ffmpegProcess.waitForFinished(-1)) { qDebug() << "FFmpeg process failed"; } ``` 5. **处理结果**: FFmpeg完成后,你可以读取输出文件,或者检查返回值判断是否成功。 需要注意的是,FFmpeg的命令可能会根据你的具体需求调整,比如指定输入输出编码格式、分辨率等。同时,为了保证线程安全,最好将上述步骤封装在一个单独的函数或者异步任务中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值