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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

turbolove

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

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

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

打赏作者

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

抵扣说明:

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

余额充值