目录
一、文件操作相关类
1.QFile
2.QFileInfo
3.QTextStream
4.QDataStream
5.QDir
6.QFileSystemWatcher
7.QTemporaryFile
二、文件操作示例
1.文本文件操作
2.目录操作
3.二进制文件操作
一、文件操作相关类
1.QFile
QFile类用于文件的创建、读写、复制、删除等操作,可以实现文本文件和二进制文件的读写。
常用函数:
- open():打开文件,参数决定文件的打开方式,如只读、只写、读写、追加等。
- close():关闭文件。
- readLine():读取一行。
- readAll():读取所有内容。
- write():向文件中写入数据。
- atEnd():判断是否到达文件尾。
- seek():将文件指针定位到指定位置处。
- pos():获取文件指针当前位置。
2.QFileInfo
QFileInfo类用于提供文件信息,包括文件的名称、在文件系统中的路径、文件的访问权限等,还可以获取文件的大小和最近一次修改的时间。
常用函数:
- exists():判断文件是否存在。
- isSymLink():判断文件是否是符号链接。
- symLinkTarget():如果文件是符号链接,返回原始文件的完整路径文件名,否则返回空字符串。
- size():获取文件大小。
- lastModified():获取文件最后修改时间。
- lastRead():获取文件最后读取时间。
- permissions():获取文件权限。
3.QTextStream
QTextStream类用于对数据进行文本格式的读/写操作,可以操作QIODevice、QByteArray和QString。
- 写入操作:使用流插入运算符<<可以方便地将各种数据类型写入到文本流中,如整数、浮点数、字符串等。
- 读取操作:使用流提取运算符>>可以从文本流中读取各种数据类型。还提供了readLine()、readAll()等函数用于按行或一次性读取所有文本内容。
- 格式设置:可以通过setFieldWidth()、setPadChar()等函数设置字段宽度和填充字符;通过setFieldAlignment()设置字段对齐方式;通过setRealNumberNotation()和setRealNumberPrecision()设置实数的表示形式和精度等。
常用函数:
- operator>>():从流中读取数据。
- operator<<():向流中写入数据。
- readLine():读取一行文本。
- readAll():读取全部文本。
4.QDataStream
QDataStream类用于对数据进行二进制格式的读写操作,只能操作QIODevice或QByteArray。
- 写入操作:使用流插入运算符<<将各种数据类型以二进制形式写入到数据流中,支持的Qt类型包括QBrush、QColor、QDateTime、QFont、QPixmap、QString、QVariant等,还包括QList、QVector、QSet、QMap等容器类型。
- 读取操作:使用流提取运算符>>从数据流中读取数据,读取数据类型的顺序应与写入时的一致。
- 版本控制:可以通过setVersion()函数设置版本号,以确保在读取和写入复杂类型时使用相同的版本,保证数据的兼容性。
- 字节序设置:可以通过setByteOrder()函数设置字节序,默认是大端字节序。
- 原始数据读写:提供了readRawData()和writeRawData()函数用于直接读写原始的未编码二进制数据,还提供了readBytes()和writeBytes()函数,先读取或写入一个quint32值表示数据长度,然后再读取或写入相应字节的数据。
常用函数:
- operator>>():从流中读取二进制数据。
- operator<<():向流中写入二进制数据。
- readRawData():将数据从流中读取到预先分配的缓冲区中。
- writeRawData():将数据写入到流中。
5.QDir
QDir类用于操纵路径名和底层的文件系统,如创建文件夹、遍历文件夹等。
常用函数:
- exists():判断目录是否存在。
- mkdir():创建一个新的目录。
- rmdir():删除一个空目录。
- entryList():返回目录中的文件和目录列表。
- cd():切换当前目录。
- cdUp():切换到上级目录。
- absolutePath():获取目录的绝对路径。
- canonicalPath():获取目录的规范路径。
6.QFileSystemWatcher
QFileSystemWatcher类通过观察指定路径的列表来监视文件系统中文件和目录的更改,当文件已被修改、重命名或从磁盘中删除就会发送相应信号。
常用函数:
- addPath():添加一个监视路径。
- removePath():移除一个监视路径。
- directories():返回正在监视的目录列表。
- files():返回正在监视的文件列表。
- directoryChanged:当监视的目录发生变化时发射此信号。
- fileChanged:当监视的文件发生变化时发射此信号。
7.QTemporaryFile
QTemporaryFile类用于创建临时文件,临时文件在应用程序运行时用于暂时存储数据,在不需要时通常会自动删除。
常用函数:
- open():打开临时文件以进行读取和写入操作。
- write():将数据写入临时文件。
- readAll():一次性读取整个临时文件的内容。
- fileName():获取临时文件的路径。
- size():获取临时文件的大小。
- autoRemove():设置临时文件在销毁时是否自动删除。
二、文件操作示例
1.文本文件操作
//获取应用程序当前目录的绝对路径QString cur_path = QCoreApplication::applicationDirPath();//选择文件QString cur_name = QFileDialog::getOpenFileName(this, "Open File",cur_path,"txt(*.txt);;all(*.*);;images(*.png *.jpg)");if(cur_name.isEmpty()) return;//打开文件QFile cur_file(cur_name);if(!cur_file.open(QIODevice::ReadOnly|QIODevice::Text)) return;//读文件QTextStream cur_stream(&cur_file);//全部读取QString str = cur_stream.readAll();qDebug()<<str;//按行读取while(!cur_stream.atEnd()){QString str = cur_stream.readLine();qDebug()<<str;}//创建一个新文件QFile new_file("D:/test01.txt");if(!new_file.open(QIODevice::WriteOnly)) return;QTextStream new_stream(&new_file);//写文件new_stream<<"Hello World!";new_file.close();//删除文件if(new_file.exists())new_file.remove();//复制文件两种方式if(!QFile::copy(cur_name,new_file.fileName())) return;//if(!cur_file.copy(new_file.fileName())) return;//文件信息QFileInfo info(cur_name);if(!info.exists()) return;qDebug() << "文件名称:" << info.fileName();qDebug() << "文件路径:" << info.filePath();qDebug() << "文件大小:" << info.size() << "bytes";qDebug() << "文件最后读取时间:"<< info.lastRead().toString("yyyy-MM-dd hh:mm:ss");qDebug() << "文件最后修改时间:"<< info.lastModified().toString("yyyy-MM-dd hh:mm:ss");//关闭文件cur_file.close();
2.目录操作
//遍历目录QDir dir_traverse("D:/");QStringList dir_list = dir_traverse.entryList(QDir::NoDotAndDotDot|QDir::AllEntries);qDebug()<<"D:";for(int i=0;i<dir_list.size();i++)qDebug()<<dir_list[i];//创建目录QDir new_dir;QString new_path = "D:/new_directory";if(!new_dir.exists(new_path))if(!new_dir.mkdir(new_path))qDebug()<<"create error";//重命名目录QDir rename_dir;QString old_name = "D:/new_directory";QString new_name = "D:/renamed_directory";if(rename_dir.exists(old_name))if(!rename_dir.rename(old_name,new_name))qDebug()<<"rename error";//删除目录QDir delete_dir;QString delete_path = "D:/renamed_directory";if(delete_dir.exists(delete_path))if(!delete_dir.rmdir(delete_path))qDebug()<<"delete error";//获取当前目录QString current_path = QDir::currentPath();qDebug()<<"current directory: "<<current_path;//切换目录QDir change_dir;QString change_path = "D:/";if(change_dir.cd(change_path))qDebug()<<"current directory: "<<change_path;
3.二进制文件操作
写入二进制文件:
class Person{
public:QString name;qint16 age;
};//重载<<运算符
QDataStream& operator<<(QDataStream &out, const Person &person){out<<person.name<<person.age;return out;
}QFile file("D:/test02.txt");
if(!file.open(QIODevice::WriteOnly)) return;QDataStream out(&file);
out.setVersion(QDataStream::Qt_6_0);int x1 = 12;
double x2 = 5.55;
QString x3 = "hello";Person p1 = {"Alice",25};
Person p2 = {"Bob",23};out<<x1<<x2<<x3<<p1<<p2;file.close();
读取二进制文件:
class Person{
public:QString name;qint16 age;
};//重载>>运算符
QDataStream& operator>>(QDataStream &in, Person &person){in>>person.name>>person.age;return in;
}QFile file("D:/test02.txt");
if(!file.open(QIODevice::ReadOnly)) return;QDataStream in(&file);
in.setVersion(QDataStream::Qt_6_0);int x1;
double x2;
QString x3;Person p1;
Person p2;in>>x1>>x2>>x3>>p1>>p2;qDebug()<<x1<<x2<<x3;
qDebug()<<p1.name<<p1.age;
qDebug()<<p2.name<<p2.age;file.close();