目录
一、文件操作相关类
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();