Qt 常用文件操作类
1.QIODevice类
直接继承自QObject,为设备提供了公共实现和抽象接口,用于读写块数据.
抽象类,不能被实例化.
3. IO类支持随机存储,和顺序储存设备。其中顺序设备不支持pos(),size()方法,一般用于网络通讯等设备如:QTcpSocket 。
4. IO类发射readyRead() 信号表示有数据可以读取,对应的可以调用bytesAvailable()方法了解可以读取多少字节的数据。
同理,发射bytesWritten()信号表示数据写入完成,对应的可以调用bytesToWrite()方法了解写入了多少字节的数据
5. IO类的读写函数是非阻塞的,调用方法后不会等待数据读写完成方法立即返回。因此类还提供了waitForReadyRead()和
waitForBytesWriten()方法实现阻塞(在调用读写方法后调用对应的wait...方法实现阻塞)
6. IO类继承于QIODevice类,只需要实现自己的writeData()和readData()方法。其他读写方法QIODevice都是调用writeData()
和readData()实现的
7. IO类例如QFile,QTcpSocket提供了buffer机制,用于减少底层驱动系统调用,提高访问速度。特别是提高了getChar,putChar方法的速度
。但是在多对象需要读取同一个设备的大批量数据时,buffer会导致内存中存在多个同样的数据副本,内存开销巨大。这个情况,可以
在调用open()方法时设置Unbuffered模式关闭buffer机制。
常用的方法:
1. 设置相关
open(OpenMode mode):打开设备。mode参数用于设置读写模式,buffer机制,读写机制等。
close():关闭设备
isOpen():判断设备是否被打开。
isWriteable:判断设备是否支持写入模式。(Open方法设置的)
isReadable:判断设备是否支持读取。
isSequential():判断设备是否是顺序设备
isTextModeEnable():Text模式getChar方法将忽略'/r'换行符,返回下个字符。
setTextModeEnable():设置text模式
2. 读相关
QByteArray read (qint64 maxlen),qint64 read (char *data, qint64 maxlen):
peek():偷窥方法,读取数据后不会移动数据指针,peek调用后可以继续调用read获取同样的内容
readAll():
qint64 readLine (char *data, qint64 maxlen):读取一行遇到'n'或者读取长度maxlen-1,或者END返回
canReadLine :在buffer中检查是否有'n',也因此如果在关闭buffer功能的情况下该方法永远返回false
getChar():读取一个字符,如果在text模式下,忽略'r'换行标识符,返回下一个字符
3. 写相关
write:
ungetChar():回写一个字符到设备,并且当前读写指针减少一个(读写指针pos() 如果是0不会减少),用户“undo”
putChar():写入一个字符到设备
(1)写入文本文件
- QFile f("c:\\test.txt");
- if(!f.open(QIODevice::WriteOnly | QIODevice::Text))
- {
- cout << "Open failed." << endl;
- return -1;
- }
- QTextStream txtOutput(&f);
- QString s1("123");
- quint32 n1(123);
- txtOutput << s1 << endl;
- txtOutput << n1 << endl;
- f.close();
(2)读取文本文件
- QFile f("c:\\test.txt");
- if(!f.open(QIODevice::ReadOnly | QIODevice::Text))
- {
- cout << "Open failed." << endl;
- return -1;
- }
- QTextStream txtInput(&f);
- QString lineStr;
- while(!txtInput.atEnd())
- {
- lineStr = txtInput.readLine();
- cout << lineStr << endl;
- }
- f.close();
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类提供了与系统无关的文件信息,它能提供文件名称和路径,存取权限,以及文件是否为目录或符号链接,文件大小,以 及
最后修改/读取的时间等。QFileInfo也能从资源中获取信息。QFileInfo可以使用相对路径或绝对路径。
(1)文件属性信息
- QFileInfo info("/home/aoyang/network-manager-applet.tar.gz");
- bool isExists = info.exists(); //判断文件是否存在,若存在返回true
- qint64 size = info.size(); //获取文件大小,返回bytes
- QDateTime created = info.created(); //文件创建时间
- QDateTime lastModified = info.lastModified(); //文件最近修改时间
- QDateTime lastRead = info.lastRead(); //文件最近读取时间
- bool isDir = info.isDir(); //判断是否是路径
- bool isFile = info.isFile(); //判断是否是文件
- bool isSymLink = info.isSymLink(); //判断是否是符号链接
- bool isHidden = info.isHidden(); //文件是否隐藏
- bool isReadable = info.isReadable(); //文件是否可读
- bool isWritable = info.isWritable(); //文件是否可写
- bool isExecutable =info.isExecutable(); //文件是否可执行
2)文件路径信息
- QString absolutefilepath = info.absoluteFilePath(); //绝对文件路径:/home/aoyang/network-manager-applet.tar.gz
- QString absolutepath = info.absolutePath(); //绝对路径不包含文件名:/home/aoyang
- QString basename = info.baseName(); //无路径并第一个.前的名称:network-manager-applet
- QString completebasename = info.completeBaseName(); //最后一个.前的名称:network-manager-applet.tar
- QString completesuffix = info.completeSuffix(); //第一个.后的后缀:tar.gz
- QString filename = info.fileName(); //文件全名称:network-manager-applet.tar.gz
- QString filepath = info.filePath(); //文件路径全名称:/home/aoyang/network-manager-applet.tar.gz
- QString path = info.path(); //文件路径:/home/aoyang
- QString suffix = info.suffix(); //文件后缀:gz
4.QDir类
QDir类提供了访问目录结构和他们的内容。
QDir类提供了访问目录结构和它们的内容的与平台无关的方式。
QDir用来操作路径名称、关于路径和文件的访问信息和操作底层文件系统。
QDir使用相对或绝对文件路径来指向一个文件。绝对路径是从目录分隔符“/”或者带有一个驱动器标识(除了在Unix下)。如果你总是使用“/”作为目录分隔符,Qt将会把你的路径转化为符合底层的操作系统的。相对文件名是由一个目录名称或者文件名开始并且指定一个相对于当前路径的路径。
QDir可以操作目录,存取目录或文件信息,操作底层文件系统,而且还可以存取Qt的资源文件。Qt使用/作为通用的目录分割符和URL路径分隔符,Qt会自动地转换你的路径来匹配你的基础的操作系统。Qt可以使用相对路径和绝对路径指向一个文件,isRelative()和 isAbsolute()函数可以判断QDir对象使用的是相对路径还是绝对路径。将相对路径转换为绝对路径使用makeAbsolute()函数。目录 路径可以通过path()函数返回,通过setPath()函数设置新路径,绝对路径使用absolutePath()返回。目录名可以使用 dirName()返回。目录的路径可以通过cd()、cdUp()改变,可以使mkdir()创建目录,rename()改变目录名。判断目录是否存在可以使用exists(),目录的属性可以使用 isReadable(),isAbsolute(),isRelative()和isRoot()来获取,目录下有很多条目,包括文件、目录和符号链 接,总的条目数可以使用count()来统计。entryList()可以返回目录下所有条目组成的字符串链表,文件可以使用remove()函数删 除,rmdir()删除目录。
(1) 绝对路径的用法:
QDir("/home/user/Documents")
QDir("C:/Documents and Settings")或使用QDir("C:\\Documents and Settings")来代替
相对路径的用法:
QDir("images/landscape.png")
(2) QDir mDir("/home/user/Desktop");
mDir.exists(); //测试文件是否存在
mDir.absoluteFilePath("main.cpp"); //返回指定目录下指定文件的绝对路径
mDir.dirName(); //剥离掉路径,只返回目录的名字
其他的可以参看QT文档。
我们可以使用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(); }