磁盘文件IO
我们知道C++中读写文件是通过标准库iostream实现的。实际上,Qt框架中还有一些对文件IO的封装,使用起来更加简便。
读写文本文件
Qt中,我们可以使用QFile和QTextStream文本流来读写文本文件。下面例子实现了两个函数,一个读取文本到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进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。