Qt下文件操作
1.QIODevice类
直接继承自QObject,为设备提供了公共实现和抽象接口,用于读写块数据.
抽象类,不能被实例化.
2.QFile类
继承自QIODevice,用来读写二进制文件和文本文件的输入/输出设备.
QFile可以自己单独使用,但是如果和QDataStream或QTextStream一起使用将更加方便.
方法:
打开文件:open();
关闭文件:close();
刷新缓冲:flush();
读取文件:read(); readLine(); readAll(); QTextStream QDataStream
写入文件:write(); QTextStream QDataStream
文件大小:size();
当前位置:pos();
移动位置:seek();
判断末尾:atEnd();
文件可以用open()来打开、用close()来关闭、用flush()来刷新。数据通常可以使用QDataStream或者QTextStream进行读写,但你也可以使用read(),readLine(),readAll(),write()读写。QFile也支持getChar(),putChar(),和ungetChar().
size()可以返回文件的大小。你可以通过使用pos()函数得到当前文件位置或者使用seek()移到一个新的文件位置。如果你到了文件的末尾,atEnd()返回真。
#include <QtCore/QCoreApplication> #include <QFile> #include <QDebug> #include <QTextCodec> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); //中文支持 QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForCStrings(codec); 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; } return a.exec(); }
QTextStream和QDataStream使用重载后的运算符<<(输出操作) >>(读取操作)
进行数据的读取和写入操作.
#include <QtCore/QCoreApplication> #include <QFile> #include <QDebug> #include <QTextCodec> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); //中文支持 QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForCStrings(codec); //QTextCodec::setCodecForTr(codec); //QTextCodec::setCodecForLocale(codec); QFile file("/home/administrator/testdir/test.txt"); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug()<<"Can't open the file!"<<endl; } QTextStream in(&file); while( !in.atEnd()){ QString line = in.readLine(); qDebug() << line; } return a.exec(); }
#include <QtCore/QCoreApplication> #include <QFile> #include <QDebug> #include <QTextCodec> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); //中文支持 QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForCStrings(codec); //QTextCodec::setCodecForTr(codec); //QTextCodec::setCodecForLocale(codec); 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; } return a.exec(); }
3. QFileInfo类
返回文件/链接的信息,且与平台无关.
QFileInfo info("D:/1.2.txt"); info.isSymlink(); //是否未链接文件 info.absoluteFilePath(); //文件的绝对路径 info.size(); //文件大小 info.symlinkTarget(); //链接指向文件的绝对路径 info.baseName(); //文件名,不包括所有完整后缀 1.2.txt会返回1 1.2.3.4.txt 也是返回1 info.bundelName(); //只有在Mac OS下才有用 info.suffix(); //后缀名 1.2.txt会返回.txt info.completeBaseName(); //文件名,不包括后缀名 1.2.txt会返回1.2 1.2.3.4.txt会返回1.2.3.4 info.completeSuffix(); //完整的后缀名 1.2.txt会返回 2.txt 1.2.3.4.txt会返回2.3.4.txt
所以,如果要获取文件/链接的真实名字(不包括后缀) 那么应该使用completeBaseName方法.
如果要获取文件/链接的真是后缀名字 那么应该使用suffix方法而不是completeSuffix方法.
4.QDir类
QDir类提供了访问目录结构和他们的内容。
QDir类提供了访问目录结构和它们的内容的与平台无关的方式。
QDir用来操作路径名称、关于路径和文件的访问信息和操作底层文件系统。
QDir使用相对或绝对文件路径来指向一个文件。绝对路径是从目录分隔符“/”或者带有一个驱动器标识(除了在Unix下)。如果你总是使用“/”作为目录分隔符,Qt将会把你的路径转化为符合底层的操作系统的。相对文件名是由一个目录名称或者文件名开始并且指定一个相对于当前路径的路径。
例如绝对路径:
QDir("/home/administrator/soft");
QDir("D:/software");
我们可以使用isRelative()或isAbsolute()函数确认QDir是用的相对路径还是绝对路径。使用makeAbsolute()来转换相对路径的QDir转换成绝对路径的QDir.
#include <QtCore/QCoreApplication> #include <QDir> #include <QList> #include <QFileInfoList> #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); 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++; // } return a.exec(); }