QT文件(夹)操作---QFile、QDir、QFileInfo、QTextStream和QDataStream异同

时间:2022-03-14 02:29:15

1.1    文件和目录

QFile、QBuffer和QTcpSocket可支持读写设备,用open函数打开,用write或putChar函数写入。用read和readLine或readAll进行读取数据,最后用 close函数进行关闭设备。

1.1.1            QFile读写文件

QFile构造函数输入参数文件路径和文件名称

setFileName:设置文件路径函数来设置;

exists:检查文件是否存在。

remove:删除文件

open:打开文件

(1)QFile实例代码:

QFile file("/home/administrator/testdir/test.txt");  //相对或者绝对路径

if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {

qDebug()<<"Can't open the file!"<<endl;

}

while(!file.atEnd()) {

QByteArray line = file.readLine();

QString str(line);

qDebug()<< str;

}

1.1.2            QTextStream和QDataStream异同

QTextStream和QDataStream都是面向数据流的,都适用于QIODevice,TextStream能做的事情QDataStream都能做。QTextStream 侧重于文本读写。这里所说的文本指的是普通的简单的QChar,QString,QLatin1Char,int等等之内的。而QDataStream则像一个容器一样,可以存放结构体等复杂数据类型,将数据序列化后按照先进先出的原则进行存储,存入的顺序和读出的顺序一定要一致,否则无法得到正确的数据。不仅可以读写text,而且还好可以读写一个特定数据类型,比如QPoint, QFont,几乎Qt支持的所有类型都可以使用QDataSream进行操作。

(1)QTextStream写入文本到文件

//下面代码就是写文件操作
QDir::setCurrent(QCoreApplication::applicationDirPath());//设置当前目录为程序运行目录

QFile data("output.txt");
if (data.open(QFile::WriteOnly | QFile::Truncate)) {
QTextStream out(&data);

out << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7;
// writes "Result: 3.14 2.7 "
}

(2)QDataSream 写入结构体到文件

就拿读写QPoint为例:

QDir::setCurrent(QCoreApplication::applicationDirPath());//设置当前目录为程序运行目录

QFile fileout("file.dat");

fileout.open(QIODevice::WriteOnly);

QDataStream out(&fileout);   // we will serialize the data into the file

out << QString("the answer is");   // serialize a string

out << (qint32)42;        // serialize an integer

QPoint pos(8, 6);//序列化一个点到文件

out << pos;//序列化一个点到文件

fileout.close();//一定要关闭,否则下面读不到数据

QFile filein("file.dat");

filein.open(QIODevice::ReadOnly);

QDataStream in(&filein);    // read the data serialized from the file

QString str;

qint32 a;

QPoint tmp;

in >> str >> a>>tmp; // extract "the answer is" and 42

1.1.3            QIODevice类

QIODevice直接继承自QObject,QIODevice类是输入/输出设备的基类。为设备提供了公共实现和抽象接口用于读写块数据。QIODevice是一个抽象类,不能被实例化Q3Socket, Q3SocketDevice,QAbstractSocket,QBuffer,QFile,QLocalSocket,QNetworkReply,QProcess继承。

read,readLine,readAll读取文件中的数据;

write写入数据;

getChar,putChar,ungetChar函数实现单个字符的操作;

size:获取文件大小;

seek:定位到文件任意位置;

pos:获取当前位置;

atEnd判断是否到文件末尾;

1.1.4            QFileInfo类

构造函数传入QFile参数

SetFile设置QFile参数

Path:获取文件路径

FileName:获取文件的名称

baseName:获取文件基本名称

suffix:获取文件名称后缀

isFile,isDir,isSymLink 判断文件类型

实例代码

#include <QtCore/QCoreApplication>

#include <QFileInfo>

#include <QDebug>

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

QFileInfo info1("E:/meego/vi_command.lnk");

qDebug() << info1.isSymLink();

qDebug() << info1.absoluteFilePath();

qDebug() << info1.size();

qDebug() << info1.symLinkTarget();

qDebug() << "**********************";

QFileInfo info2(info1.symLinkTarget());

qDebug() << info2.isSymLink();

qDebug() << info2.absoluteFilePath();

qDebug() << info2.size();

return a.exec();

}

QT文件(夹)操作---QFile、QDir、QFileInfo、QTextStream和QDataStream异同

1.2    QDir类

QDir类提供了访问目录结构和他们的内容。

QDir类提供了访问目录结构和它们的内容的与平台无关的方式。

QDir用来操作路径名称、关于路径和文件的访问信息和操作底层文件系统。

QDir使用相对或绝对文件路径来指向一个文件。绝对路径是从目录分隔符“/”或者带有一个驱动器标识(除了在Unix下)。如果你总是使用“/”作为目录分隔符,Qt将会把你的路径转化为符合底层的操作系统的。相对文件名是由一个目录名称或者文件名开始并且指定一个相对于当前路径的路径。

例如绝对路径:

QDir("/home/administrator/soft");

QDir("D:/software");

我们可以使用isRelative()或isAbsolute()函数确认QDir是用的相对路径还是绝对路径。使用makeAbsolute()来转换相对路径的QDir转换成绝对路径的QDir.

int main(int argc, char *argv[])

{

QCoreApplication app(argc, argv);

QDir dir;

dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);

dir.setSorting(QDir::Size | QDir::Reversed);

QFileInfoList list = dir.entryInfoList();

std::cout << " Bytes Filename" << std::endl;

for (int i = 0; i < list.size(); ++i) {

QFileInfo fileInfo = list.at(i);

std::cout << qPrintable(QString("%1 %2").arg(fileInfo.size(), 10)

.arg(fileInfo.fileName()));

std::cout << std::endl;

}

return 0;

}