Qt提供了QFile类来进行文件操作。为了更方便的处理文本文件和二进制文件,Qt提供了QTextStream类和QDataStream类。
处理临时文件可以使用QTemporaryFile,获取文件信息可以使用QFileInfo,处理目录使用QDir。监视文件和目录变化可以
使用QFileSystemWatcher。
一、文件 /***************************************************************************************/
eg1:
QFile file("kai.txt");
if(file.open(QIODevice::ReadOnly)){
char buffer[2048];
qint64 lineLine = file.readLine(buffer,sizeof(buffer));
if(lineLen != -1) //读取成功
qDebug() << buffer;
}
eg2: QTextStream可以操作QIODevice、QByteArray和QString
QFile data("text.txt");
if(data.open(QFile::WriteOnly | QFile::Truncate)){
QTextStream out(&data);
out << QObject::tr("成绩:") << qSetFieldWidth(10) << left << 90 << endl;
}
eg3: 写/读二进制数据到数据流
//Qt中很多类型,包括QBrush,QColor,QFont,QDateTime,QString,QVariant,QPixmap都可写入数据流。
QFile file("binary.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
out << QObject::tr("坐标:");
out << (qint32)42 << (qint32)96;
QFile file("binary.dat"); //读刚写入的数据
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
QString str;
qint32 x, y;
in >> str >> x >> y;
使用setVersion()来设定文件格式的版本:
QDataStream out(file);
out.setVersion(QDataStream::Qt_4_3); //version()获得版本号
eg4 : 使用QData进行文件读写
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("binary.file");
file.open(QIODevice::WriteOnly | QIODevice::Truncate);
QDataStream out(&file);
out << QString("zhangyue");
out << QDate::fromString("1993/06/11","yyyy/MM/dd");
out << (qint32)21;
file.close();
file.setFileName("binary.file"); //重新设置文件名
if(!file.open(QIODevice::ReadOnly)){
cout << "打开文件错误!";
return 1;
}
QDataStream in(&file);
QString name;
QDate birthday;
qint32 age;
in >> name >> birthday >> age;
qDebug() << name << birthday << age;
cout << qPrintable(name) << '\t' <<
qPrintable(birthday.toString("yyyy MMMM dd dddd"))
<< "\t" << age <<endl;
file.close();
return a.exec();
}
QDataStream 可以读取任意的以QIODevice为基类的类生成的对象产生的数据,如QTcpSocket,
QUdpSocket,QBuffer,QFile,QProcess等类的数据。可以使用QDataStream在QAbstractSocket一端
写数据,另外一端使用QDataStream读数据,这样就免去了繁琐的高低字节转换操作。
临时文件:
Qt中提供了QTemporaryFile类来操作临时文件。QTemporaryFile类可以安全地创建一个独一无二的临时文件。临时文件可以使用open()来创
建,在临时文件对象销毁后,将自动删除该临时文件。临时文件通过close()关闭后可以再打开,只要临时文件没有被
销毁,临时文件就一直存在并有QTemporaryFile内部保持打开。系统的临时目录通过QDir::tempPath()来获取。
二、目录操作和文件管理 /*********************************************************************************/
isRelative(),isAbsolute()判断QDir对象使用的是相对路径还是绝对路径;makeAbsolute()将一个相对路径转换为绝对路径。
目录的路径使用path()返回,通过setPath()设置新路径,绝对路径使用absolutePath()返回。
dirName(),cd(),cdUp(),mkdir(),rename(),exists(),isReadable(),isRoot(),count(),remove(),rmdir().
entryList()返回目录下所有条目组成的字符串链表。entryInfoList()同理
eg:
qint64 du(const QString &path){ //统计目录及子目录中所有文件的大小
QDir dir(path);
qint64 size = 0;
foreach(QFileInfo fileInfo,dir.entryInfoList(QDir::Files))
size += fileInfo.size();
foreach(QString subDir,
dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
size += du(path + QDir::separator() + subDir);
char unit = 'B';
quint64 curSize = size;
if(curSize > 1024){
curSize /= 1024;
unit = 'K';
if(curSize > 1024){
curSize /= 1024;
unit = 'M';
if(curSize > 1024){
curSize /= 1024;
unit = 'G';
}
}
}
cout << curSize << unit << "\t" << qFrintable(path) << endl;
return size;
}
//QDirIterator类也可以完成枚举目录的功能。
文件搜索前缀:
QDir::setSearchPaths("docs",QStringList("C:\My Document"));
QDir::addSearchPath("docs",QStringList("D:\Document"));
QFile file("docs:qt5.doc");
文件管理:
QFile可以使用相对路径或绝对路径。文件名可在构造函数中传递,也可用setFile()函数指定。
exists(),size(),ifFile(),isDir(),isSymLink().symLinkTarget()返回符号链接所指向的真正文件名。
为了提高性能,QFileInfo将文件的一些信息进行了缓存。refresh()函数刷新文件信息。setCaching(false)关闭缓存从文件系统中读信息
。
path()返回目录,fileName()返回的文件名可以通过baseName()和extension()来获得主文件名和扩展文件名。
文件的存取权限:isReadable(),isWriteable(),isExecutable().文件属主:owner(),ownerId(),group(),groupId()
文件的权限和属主也可以通过permission()一起读取。
三、监视文件系统变化 /*********************************************************************************/
Qt中使用QFileSystemWatcher类来监视问价和目录的改变:
addPath()/addPaths(),removePath()/removePaths();
当监视的文件被修改或删除时,产生一个fileChanged()信号;如果被监视的目录被修改或删除,产生directoryChanged()信号。
eg:
Msg::Msg(){
QFont font;
font.setPointSize(24);
setFont(font);
QStringList args = qApp->arguments();
QString path;
if(args.count() > 1)
path = args[1];
else
path = QDir::currentPath();
label = new QLabel();
label->setText(tr("监视的目录:") + path);
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(label);
setLayout(layout);
fsWatcher.addPath(path);
connect(&fsWatcher,SIGNAL(directoryChanged(QString)),
this,SLOT(directoryChanged(QString)));
}
四、文件引擎:略
处理临时文件可以使用QTemporaryFile,获取文件信息可以使用QFileInfo,处理目录使用QDir。监视文件和目录变化可以
使用QFileSystemWatcher。
一、文件 /***************************************************************************************/
eg1:
QFile file("kai.txt");
if(file.open(QIODevice::ReadOnly)){
char buffer[2048];
qint64 lineLine = file.readLine(buffer,sizeof(buffer));
if(lineLen != -1) //读取成功
qDebug() << buffer;
}
eg2: QTextStream可以操作QIODevice、QByteArray和QString
QFile data("text.txt");
if(data.open(QFile::WriteOnly | QFile::Truncate)){
QTextStream out(&data);
out << QObject::tr("成绩:") << qSetFieldWidth(10) << left << 90 << endl;
}
eg3: 写/读二进制数据到数据流
//Qt中很多类型,包括QBrush,QColor,QFont,QDateTime,QString,QVariant,QPixmap都可写入数据流。
QFile file("binary.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
out << QObject::tr("坐标:");
out << (qint32)42 << (qint32)96;
QFile file("binary.dat"); //读刚写入的数据
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
QString str;
qint32 x, y;
in >> str >> x >> y;
使用setVersion()来设定文件格式的版本:
QDataStream out(file);
out.setVersion(QDataStream::Qt_4_3); //version()获得版本号
eg4 : 使用QData进行文件读写
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("binary.file");
file.open(QIODevice::WriteOnly | QIODevice::Truncate);
QDataStream out(&file);
out << QString("zhangyue");
out << QDate::fromString("1993/06/11","yyyy/MM/dd");
out << (qint32)21;
file.close();
file.setFileName("binary.file"); //重新设置文件名
if(!file.open(QIODevice::ReadOnly)){
cout << "打开文件错误!";
return 1;
}
QDataStream in(&file);
QString name;
QDate birthday;
qint32 age;
in >> name >> birthday >> age;
qDebug() << name << birthday << age;
cout << qPrintable(name) << '\t' <<
qPrintable(birthday.toString("yyyy MMMM dd dddd"))
<< "\t" << age <<endl;
file.close();
return a.exec();
}
QDataStream 可以读取任意的以QIODevice为基类的类生成的对象产生的数据,如QTcpSocket,
QUdpSocket,QBuffer,QFile,QProcess等类的数据。可以使用QDataStream在QAbstractSocket一端
写数据,另外一端使用QDataStream读数据,这样就免去了繁琐的高低字节转换操作。
临时文件:
Qt中提供了QTemporaryFile类来操作临时文件。QTemporaryFile类可以安全地创建一个独一无二的临时文件。临时文件可以使用open()来创
建,在临时文件对象销毁后,将自动删除该临时文件。临时文件通过close()关闭后可以再打开,只要临时文件没有被
销毁,临时文件就一直存在并有QTemporaryFile内部保持打开。系统的临时目录通过QDir::tempPath()来获取。
二、目录操作和文件管理 /*********************************************************************************/
isRelative(),isAbsolute()判断QDir对象使用的是相对路径还是绝对路径;makeAbsolute()将一个相对路径转换为绝对路径。
目录的路径使用path()返回,通过setPath()设置新路径,绝对路径使用absolutePath()返回。
dirName(),cd(),cdUp(),mkdir(),rename(),exists(),isReadable(),isRoot(),count(),remove(),rmdir().
entryList()返回目录下所有条目组成的字符串链表。entryInfoList()同理
eg:
qint64 du(const QString &path){ //统计目录及子目录中所有文件的大小
QDir dir(path);
qint64 size = 0;
foreach(QFileInfo fileInfo,dir.entryInfoList(QDir::Files))
size += fileInfo.size();
foreach(QString subDir,
dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
size += du(path + QDir::separator() + subDir);
char unit = 'B';
quint64 curSize = size;
if(curSize > 1024){
curSize /= 1024;
unit = 'K';
if(curSize > 1024){
curSize /= 1024;
unit = 'M';
if(curSize > 1024){
curSize /= 1024;
unit = 'G';
}
}
}
cout << curSize << unit << "\t" << qFrintable(path) << endl;
return size;
}
//QDirIterator类也可以完成枚举目录的功能。
文件搜索前缀:
QDir::setSearchPaths("docs",QStringList("C:\My Document"));
QDir::addSearchPath("docs",QStringList("D:\Document"));
QFile file("docs:qt5.doc");
文件管理:
QFile可以使用相对路径或绝对路径。文件名可在构造函数中传递,也可用setFile()函数指定。
exists(),size(),ifFile(),isDir(),isSymLink().symLinkTarget()返回符号链接所指向的真正文件名。
为了提高性能,QFileInfo将文件的一些信息进行了缓存。refresh()函数刷新文件信息。setCaching(false)关闭缓存从文件系统中读信息
。
path()返回目录,fileName()返回的文件名可以通过baseName()和extension()来获得主文件名和扩展文件名。
文件的存取权限:isReadable(),isWriteable(),isExecutable().文件属主:owner(),ownerId(),group(),groupId()
文件的权限和属主也可以通过permission()一起读取。
三、监视文件系统变化 /*********************************************************************************/
Qt中使用QFileSystemWatcher类来监视问价和目录的改变:
addPath()/addPaths(),removePath()/removePaths();
当监视的文件被修改或删除时,产生一个fileChanged()信号;如果被监视的目录被修改或删除,产生directoryChanged()信号。
eg:
Msg::Msg(){
QFont font;
font.setPointSize(24);
setFont(font);
QStringList args = qApp->arguments();
QString path;
if(args.count() > 1)
path = args[1];
else
path = QDir::currentPath();
label = new QLabel();
label->setText(tr("监视的目录:") + path);
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(label);
setLayout(layout);
fsWatcher.addPath(path);
connect(&fsWatcher,SIGNAL(directoryChanged(QString)),
this,SLOT(directoryChanged(QString)));
}
四、文件引擎:略