磁盘文件IO

我们知道C++中读写文件是通过标准库iostream实现的。实际上,Qt框架中还有一些对文件IO的封装,使用起来更加简便。

读写文本文件

Qt中,我们可以使用QFileQTextStream文本流来读写文本文件。下面例子实现了两个函数,一个读取文本到textEdit,一个将文本写入文件。

读取文本文件例子如下。

void MainWindow::readFile(QString path)
{
    if(!path.isEmpty())
    {
        QFile file(path);
        if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QMessageBox::warning(this, "警告", "读取文件失败");
        }
        else
        {
            QTextStream in(&file);
            in.setCodec("UTF-8");
            ui->textEdit->setText(in.readAll());
            curFilePath = path;
            file.close();
        }
    }
}

读取文件时,首先使用file.open()函数打开文件,其中ReadOnly表示只读形式打开,Text表示以文本文件形式打开。这里我们直接使用了readAll()方法将文本文件的所有内容读入textEdit(对于上G的大文件不要这么做)。另外要注意的是QTextStream需要设置文本字符编码,这里我们使用UTF-8

写入文本文件例子如下。

void MainWindow::saveFile(QString path)
{
    if (!path.isEmpty())
    {
        QFile file(path);
        if (!file.open(QIODevice::WriteOnly))
        {
            QMessageBox::warning(this, "警告", "写入文件失败");
        }
        else
        {
            QTextStream out(&file);
            out.setCodec("UTF-8");
            out << ui->textEdit->toPlainText() << endl;
            file.close();
        }
    }
}

写入的写法也差不多,这里我们以只写方式打开文件,QTextStream可以使用<<操作符写入数据,比较方便。

读写二进制文件

前面我们介绍了读写文本内容,QDataStream则能够以二进制形式读写内容,一般用于数据的序列化和反序列化读写。下面例子中,我们实现将一些数据以二进制形式写入,然后再读出的功能。

// 写入
QFile file("E:/1.dat");
if (file.open(QIODevice::WriteOnly))
{
    QDataStream out(&file);
    out << (quint32) 666 << QString("Hello");
}
file.close();

// 读取
if (file.open(QIODevice::ReadOnly))
{
    QDataStream in(&file);
    quint32 v1;
    QString v2;
    in >> v1 >> v2;
    qDebug() << v1 << v2;
}
file.close();

获取文件信息

QFileInfo能够基于文件系统获取文件的相关信息,比如文件名、大小、最后修改时间等。

QFile file("E:/1.dat");
QFileInfo info(file);

qDebug() << info.fileName() << info.filePath() << info.lastModified().toString("yyyy-MM-dd hh:mm:ss");

上面代码中,我们输出了一些文件的相关信息。除此之外,还有很多信息可以显示,具体参考文档即可。

目录操作

QDir用于文件系统目录操作,能够进行删除目录、创建目录等操作,其中查询目录还支持设置过滤器、设置排序规则,功能非常强大。

下面例子代码中,我们列出E:/目录下的文件,并利用QFileInfo输出一些信息。

QDir d("E:/");
d.setFilter( QDir::Files | QDir::Dirs | QDir::Hidden );
d.setSorting( QDir::Name );
QFileInfoList fileInfoList = d.entryInfoList();
for (int i = 0; i < fileInfoList.size(); i++)
{
    qDebug() << fileInfoList[i].fileName()
                << fileInfoList[i].size()
                << fileInfoList[i].lastModified().toString("yyyy-MM-dd hh:mm:ss");
}

代码中,我们使用entryInfoList()获得了E:/下符合筛选条件的所有文件和目录,并对其遍历输出信息。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。