今天学习QT的文件操作
1、QIODevice
直接继承自QObject
QIODevice类是输入/输出设备的基类。
QIODevice为设备提供了公共实现和抽象接口用于读写块数据。
QIODevice是一个抽象类,不能被实例化。
被Q3Socket,Q3SocketDevice,QAbstractSocket,QBuffer,QFile,QLocalSocket,QNetworkReply,QProcess继承.
===============================================================================================
2、QFile
继承自QIODevice
QFile类是一个操作文件的输入/输出设备。
QFile是用来读写二进制文件和文本文件的输入/输出设备。QFile可以自己单独被使用,但是如果和QDataStream或QTextStream一起使用将更加方便。
文件名通常可以通过构造函数来传递,但也可以使用setName()来设置。目录分隔符在任何操作系统下都使用“/",“/"不被支持。你可以通过exists()来检查一个文件是否存在并且可以通过remove()来移去一个文件。更多操作系统相关的高级文件系统操作QT提供了QFileInfo和QDir类.
文件可以用open()来打开、用close()来关闭、用flush()来刷新。数据通常可以使用QDataStream或者QTextStream进行读写,但你也可以使用read(),readLine(),readAll(),write()读写。QFile也支持getChar(),putChar(),和ungetChar()
size()可以返回文件的大小。你可以通过使用pos()函数得到当前文件位置或者使用seek()移到一个新的文件位置。如果你到了文件的末尾,atEnd()返回真。
一行一行直接读取文件
- 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;
- }
使用QTextStream读取文件
- QFile file("/proc/modules");
- if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
- return;
- QTextStream in(&file);
- QString line = in.readLine();
- while (!line.isNull()) {
- process_line(line);
- line = in.readLine();
- }
使用QTextStream写入文件
- QFile file("out.txt");
- if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
- return;
- QTextStream out(&file);
- out << "The magic number is: " << 49 << "\n";
QDataStream 重载了运算符了"<<"写数据,>>读数据
- QFile file("/home/administrator/testdir/test.txt");
- if(!file.open(QIODevice::ReadWrite | QIODevice::Text)) {
- qDebug()<<"Can't open the file!"<<endl;
- }
- QTextStream stream(&file);
- QString line_in;
- // while( !stream.atEnd()){
- // line_in = stream.readLine();
- // qDebug() << line_in;
- // }
- // stream.seek(stream.pos());
- stream.seek(file.size());//将当前读取文件指针移动到文件末尾
- int count = 0;
- while(count < 10){
- stream << QObject::trUtf8("新建行:") <<++count<<"/n";
- }
- stream.seek(0);//将当前读取文件指针移动到文件开始
- while( !stream.atEnd()){
- line_in = stream.readLine();
- qDebug() << line_in;
- }
3、QDir
QDir类提供了访问目录结构和他们的内容。
QDir类提供了访问目录结构和它们的内容的与平台无关的方式。
QDir用来操作路径名称、关于路径和文件的访问信息和操作底层文件系统。
QDir使用相对或绝对文件路径来指向一个文件。绝对路径是从目录分隔符“/”或者带有一个驱动器标识(除了在Unix下)。如果你总是使用“/”作为目录分隔符,Qt将会把你的路径转化为符合底层的操作系统的。相对文件名是由一个目录名称或者文件名开始并且指定一个相对于当前路径的路径。
例如绝对路径:
QDir("/home/administrator/soft");
QDir("D:/software");
我们可以使用isRelative()或isAbsolute()函数确认QDir是用的相对路径还是绝对路径。使用makeAbsolute()来转换相对路径的QDir转换成绝对路径的QDir.
- QDir d("D:/");
- d.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks | QDir::AllDirs);//列出文件,列出隐藏文件(在Unix下就是以.开始的为文件),不列出符号链接(不支持符号连接的操作系统会忽略)
- d.setSorting(QDir::Size | QDir::Reversed);//按文件大小排序,相反的排序顺序
- const QFileInfoList list = d.entryInfoList();//返回这个目录中所有目录和文件的QFileInfo对象的列表
- QFileInfoList::const_iterator iterator = list.begin();
- qDebug() << "目录和文件的数量: " << d.count();//返回找到的目录和文件的数量
- qDebug() << "fileName/t/t/tsize/t/t/t";
- while(iterator != list.end()){
- qDebug() << (*iterator).fileName()<<"/t/t/t"<<(*iterator).size();
- iterator++;
- }
- qDebug() << "当前目录: " << d.current();//返回应用程序当前目录。
- qDebug() << "当前目录的绝对路径" << d.currentPath();//返回应用程序当前目录的绝对路径。
- // const QList<QString> list = d.entryList(); //返回这个目录中所有目录和文件的名称的列表
- // QList<QString>::const_iterator iterator = list.begin();
- // while(iterator != list.end()){
- // qDebug() << (*iterator);
- // iterator++;
- // }
运行结果:
4、QFileInfo
QFileInfo类提供了一个与平台无关的文件信息.
QFileInfo提供了关于系统中的文件名称和位置,访问权限和是否是符号链接,文件大小和上次修改/读写时间等,也能被用于Qt资源文件。
QFileInfo能通过相对/绝对路径指向一个文件。
可以使用isFile(),isDir(),isSymLink().symLinkTarget()函数提供符号链接的目标文件。
在Unix(包括Mac OS X)的符号链接具有与目标文件相同的大小(),因为Unix透明地处理符号链接;同样,打开一个符号连接使用的QFile有效地打开链接的目标.
在Windows中,符号链接(快捷方式)的lnk文件。它大小()的是,符号链接(而不是链接的目标)的大小,打开一个符号连接使用的QFile并打开。lnk文件。例如
- #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();
- }
运行结果:
- #include <QtCore/QCoreApplication>
- #include <QFileInfo>
- #include <QDebug>
- #include <QTextCodec>
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- QTextCodec *codec = QTextCodec::codecForName("GB2312");
- QTextCodec::setCodecForLocale(codec);
- QTextCodec::setCodecForCStrings(codec);
- QTextCodec::setCodecForTr(codec);
- QFileInfo info("E:/meego/基本命令与VI.Command.txt");
- qDebug() << info.baseName();//不包括后缀名
- qDebug() << info.bundleName();//只有在Mac OS才有用,其它平台为空字符串
- qDebug() << info.suffix();//后缀名
- qDebug() << info.completeBaseName();//不包括后缀名
- qDebug() << info.completeSuffix();//完整的后缀名
- return a.exec();
- }
运行结果: