Qt5文件及磁盘处理

Qt5文件及磁盘处理

读写文本文件的方法通常有两种:一种是直接利用传统的QFile类方法;另一 种是利用更为方便的QTextStream类方法。

读写文本文件

QFile类读写文本

QFile类提供了读写文件的接口,这里首先介绍如何使用QFile类读写文本文件。

#include <QApplication>
#include <QFile>
#include <iostream>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFile file("1.txt");
    if(file.open(QIODevice::ReadOnly))
    {
        char buffer[2048];
        qint64 lineLen = file.readLine(buffer, sizeof(buffer));
        if (lineLen != -1)
        {
            std::cout << buffer << std::endl;
        }
    }
    return a.exec ();
}

打开文件使用 open()函数,关闭文件使 用close ()函数。此处的open()函数以只读方式打开文件,只读方式参数为 QIODevice::ReadOnly ,只写方式参数为 QIODevice::WriteOnly ,读写参数为 QIODevice: :ReadWrite。

QTextStream 类读写文本

QTextStream提供了更为方便的接口来读写文本,它可以操作QIODevice、 QByteArray和QString。使用QTextStream的流操作符,可以方便地读写单词、行 和数字。为了产生文本,QtextStream还提供了填充、对齐和数字格式化的选项。

#include <QApplication>
#include <QFile>
#include <iostream>
#include <QTextStream>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFile data("1.txt");
    if(data.open(QFile::WriteOnly|QFile::Truncate))
    {
        QTextStream out(&data);
        out << QObject::tr("score: ") << qSetFieldWidth (10) << left << 90 << endl;
    }
    data.close();
    return a.exec ();
}

参数 QFile::Truncate 表示 将原来文件中的内容清空。输出时将格式设为左对齐,占10个字符位置。

QTextStream的格式化函数

函 数功能描述
qSetFieldWidth(int width)设置字段宽度
qSetPadChar(QChar ch)设置填充字符
qSetRea!NumberPercision(int precision)设置实数精度

其中,left操作符是QTextStream定义的类似于<iostream>中的流操作符。 QTextStream还提供了其他一些流操作符。

QTextStream的流操作符

操作符作用描述
bin设置读写的整数为二进制数
oct设置读写的整数为八进制数
dec设置读写的整数为十进制数
hex设置读写的整数为十六进制数
showbase强制显示进制前缀,如十六进制(Ox)、八进制(O)、二进制(Ob)
fbrcesign强制显ZK符号(+, -)
fbrcepoint强制显示小数点
noshowbase不显示进制前缀
nofbrcesign不显示符号
uppercasebase显示大写的进制前缀
lowercasebase显示小写的进制前缀
uppercasedigits用大写字母表示
lowercasedigits用小写字母表示
fixed固定小数点表示
scientific科学计数法表示
left左对齐
right右对齐
center居中
endl换行
flush清除缓冲

注意: 在 QTextStream 中使用的默认编码是 QTextCodec::codecForLocale() 函数返回的编码,同时能够自动检测Unicode,也可以使用QTextStream::setCodec (QTextCodec *codec)函数设置流的编码。

读写二进制文件

QDataStream类提供了将二进制文件串行化的功能,用于实现C++基本数据类 型,如char、short、 int、char *等的串行化。更复杂的串行化操作则是通过将数据 类型分解为基本类型来完成的。

#include <QApplication>
#include <QFile>
#include <iostream>
#include <QDataStream>
#include <QDate>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFile file("binary.dat");
    file.open(QIODevice::WriteOnly | QIODevice::Truncate);
    QDataStream out(&file) ;	        //将数据序列化
    out << QString(QObject::tr("测试名称:"));	//字符串序列化
    out << QDate::fromString("1994/09/25","yyyy/MM/dd");
    out << (qint32) 19;	            //整数序列化
    file.close ();
    file.setFileName("binary.dat");

    if(!file.open(QIODevice::ReadOnly))
    {
        std::cout << "error!";
        return -1;
    }


    QDataStream in(&file) ;	//从文件中读出数据
    QString name;
    QDate birthday;
    qint32 age;
    in >> name >> birthday >> age;	//获取字符串和整数
    std::cout << name.toStdString() << birthday.toString("yyyy/MM/dd").toStdString() << age << std::endl;
    file.close ();
    return a.exec ();
}

目录操作与文件系统

QDir类具有存取目录结构和内容的能力,使用它可以操作目录、存取目录或 文件信息、操作底层文件系统,而且还可以存取Qt的资源文件。

Qt使用“/”作为通用的目录分隔符和URL路径分隔符。如果在程序中使用“/” 作为目录分隔符,Qt会将其自动转换为符合底层操作系统的分隔符(如Linux使用 Windows 使用 “\”)。

QDir可以使用相对路径或绝对路径指向一个文件。isRelative。和isAbsolute() 函数可以判断QDir对象使用的是相对路径还是绝对路径。如果需要将一个相对路 径转换为绝对路径,则使用makeAbsolute()函数。

目录的路径可以通过path()函数返回,通过setPath()函数设置新路径。绝对路 径使用absolutePath()返回,目录名可以使用dirName()获得,它通常返回绝对路径 中的最后一个元素,如果QDir指向当前目录,则返回“.”。目录的路径可以通过 cd()和cdUp()改变。可以使用mkdir()仓ij建目录,rename()改变目录名。

判断目录是否存在可以使用exists(),目录的属性可以使用isReadable()、 isAbsolute()、isRelative()和isRoot()来获取。目录下有很多条目,包括文件、目录 和符号连接,总的条目数可以使用count()来统计。entryList()返回目录下所有条目 组成的字符串链表。文件可以使用remove()函数删除,删除目录用rmdir()。

文件大小及路径获取实例

#include <QApplication>
#include <QFile>
#include <iostream>
#include <QDir>
#include <QFileInfo>

qint64 du(const QString &path)
{
    QDir dir(path);
    qint64 size = 0;
    foreach(QFileInfo fileinfo,dir.entryInfoList(QDir::Files))
    {
        size += fileinfo.size();
    }

    foreach(QString subDir,dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot))
    {
        size += du(path + QDir::separator()+subDir);
    }
    char unit ='B';
    qint64 curSize=size;
    if (curSize>1024)
    {
        curSize/=1024;
        unit = 'K';
        if (curSize>1024)
        {
            curSize/=1024;
            unit ='M';
        }
        if (curSize>1024)
        {
            unit ='G';
            curSize/=1024;
        }
    }
    std::cout << curSize << unit <<" "<< qPrintable(path) << std::endl;
    return size;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QString path = QDir::currentPath();
    du(path);
    return a.exec ();
}

获取文件信息

QFileinfo类提供了对文件进行操作时获得的文件相关属性信息,包括文件名、 文件大小、创建时间、最后修改时间、最后访问时间及一些文件是否为目录、文件 或符号链接和读写属性等。

注意:

1.文件的所有权限可以由owner()、ownerld()、group()、groupld()等方法获 得。测试一个文件的权限可以使用Permission()方法。

2.为了提高执行的效率,QFilelnfo可以将文件信息进行一次读取缓存,这 样后续的访问就不需要持续访问文件了。但是由于文件在读取信息之后可能被其 他程序或本程序改变属性,所以QFilelnfo通过refresh()方法提供了 一种刷新机制 可以更新文件的信息,用户也可以通过setCaching()方法关闭这种缓冲功能。

3.QFilelnfo.可以使用绝对路径和相对路径指向同一个文件。其中,绝对路 径以“/”开头(在Windows中以磁盘符号开头),相对路径则以目录名或文件名 开头,isRelative()方法可以用来判断QFilelnfo使用的是绝对路径还是相对路径。 makeAbsolute()方法可以用来将相对路径转化为绝对路径。

监视文件和目录变化

在Qt中可以使用QFileSystemWatcher类监视文件和目录的改变。使用addPath() 函数监视指定的文件和目录时,如果需要监视多个目录,则可以使用addPaths()函 数加入监视。若要移除不需要监视的目录,则可以使用removePath()和removePaths() 函数。

当监视的文件被修改或删除时,产生一个fileChanged()信号。如果所监视的目 录被改变或删除,将产生directoryChanged()信号。

#include <QApplication>
#include <QFile>
#include <iostream>
#include <QDir>
#include <QFileSystemWatcher>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QString path = QDir::currentPath();
    QFileSystemWatcher *watcher = new QFileSystemWatcher();
    watcher->addPath(path);
    QObject::connect(watcher,&QFileSystemWatcher::directoryChanged,[](){
        std::cout << "change" << std::endl;
    });
    return a.exec ();
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要对磁盘上的视频文件进行编码,需要做一些修改以读取视频文件并将编码后的数据写入新的文件中。以下是一个示例代码,演示了如何对指定的视频文件进行编码: ```c++ #include <QtCore/QCoreApplication> #include <QDebug> extern "C" { #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavutil/imgutils.h> #include <libswscale/swscale.h> } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // Open input file AVFormatContext *inputContext; avformat_open_input(&inputContext, "input.mp4", NULL, NULL); avformat_find_stream_info(inputContext, NULL); // Find video stream int videoStreamIdx = -1; for (int i = 0; i < inputContext->nb_streams; i++) { if (inputContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { videoStreamIdx = i; break; } } if (videoStreamIdx == -1) { qWarning() << "No video stream found in input file!"; return -1; } // Set up codec parameters AVCodecParameters *codecParams = inputContext->streams[videoStreamIdx]->codecpar; codecParams->codec_id = AV_CODEC_ID_H264; codecParams->bit_rate = 400000; // Set up output file AVFormatContext *outputContext; avformat_alloc_output_context2(&outputContext, NULL, NULL, "output.mp4"); AVStream *outputStream = avformat_new_stream(outputContext, NULL); outputStream->codecpar = codecParams; // Open codec AVCodec *codec = avcodec_find_encoder(codecParams->codec_id); AVCodecContext *codecContext = avcodec_alloc_context3(codec); avcodec_parameters_to_context(codecContext, codecParams); avcodec_open2(codecContext, codec, NULL); // Open output file avio_open(&outputContext->pb, "output.mp4", AVIO_FLAG_WRITE); avformat_write_header(outputContext, NULL); // Set up scaling context SwsContext *imgConvertCtx = sws_getContext(codecParams->width, codecParams->height, codecParams->format, codecParams->width, codecParams->height, codecParams->format, SWS_BICUBIC, NULL, NULL, NULL); // Loop through frames AVPacket *inputPacket = av_packet_alloc(); AVFrame *inputFrame = av_frame_alloc(); AVPacket *outputPacket = av_packet_alloc(); while (av_read_frame(inputContext, inputPacket) >= 0) { if (inputPacket->stream_index == videoStreamIdx) { // Decode frame avcodec_send_packet(codecContext, inputPacket); avcodec_receive_frame(codecContext, inputFrame); // Convert frame to codec format AVFrame *outputFrame = av_frame_alloc(); outputFrame->width = codecParams->width; outputFrame->height = codecParams->height; outputFrame->format = codecParams->format; av_image_alloc(outputFrame->data, outputFrame->linesize, codecParams->width, codecParams->height, codecParams->format, 32); sws_scale(imgConvertCtx, inputFrame->data, inputFrame->linesize, 0, codecParams->height, outputFrame->data, outputFrame->linesize); // Encode frame avcodec_send_frame(codecContext, outputFrame); avcodec_receive_packet(codecContext, outputPacket); // Write encoded frame to output file av_interleaved_write_frame(outputContext, outputPacket); // Clean up av_packet_unref(outputPacket); av_frame_unref(outputFrame); } av_packet_unref(inputPacket); } // Flush codec avcodec_send_frame(codecContext, NULL); while (avcodec_receive_packet(codecContext, outputPacket) == 0) { av_interleaved_write_frame(outputContext, outputPacket); av_packet_unref(outputPacket); } // Close codec, input file, output file, and cleanup avcodec_close(codecContext); avformat_close_input(&inputContext); avio_close(outputContext->pb); avformat_free_context(outputContext); sws_freeContext(imgConvertCtx); av_packet_free(&inputPacket); av_frame_free(&inputFrame); av_packet_free(&outputPacket); return a.exec(); } ``` 这个示例代码会打开一个名为 "input.mp4" 的视频文件,并将编码数据写入一个名为 "output.mp4" 的新文件中。请注意,这只是一个大致的示例,可能需要根据您的具体情况进行修改。此外,为了简化代码,一些错误检查和异常处理可能被省略了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

turbolove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值