摘要:
这一篇Qt博文主要介绍在Qt开发中对于文件目录操作相关处理的时候可以用到哪些类,这些类的作用是什么,大致应该怎么用,类的常用类方法及相关需要注意的事项等等,更加细致的需根据类名查找翻阅官方帮助文档。
QT提供的与文件和目录操作相关的类有以下几个:
-
QDir:类提供对目录结构及其内容文件的修改添加删除访问等操作;
-
QFile:打开文件、删除文件、复制文件,还可配合其它类对文件内容进行修改;
-
QTemporaryDir、QTemporaryFile:用于创建临时目录和临时文件;
-
QTextStream:文本流类它可对IO设备进行方便的读写操作,本文主要介绍它对.txt等文本文件的读写;
-
QDataStream:二进制流类它提供对二进制数据读写的能力,本文主要介绍它对.dat等二进制文件的读写;
-
QSettings:配置.ini文件的建立,读取,写入操作;
-
QFileInfo:用于提取文件信息,包括路径、文件名、后缀等;
-
QFileSystemWatcher:提供了一个接口,用于监视文件和目录,例如目录下文件的添加、删除等变化,文件修改变化;
开发环境:Qt5.14.1、Qt Creator 4.11.1
关键词: Qt、文件目录操作、总结、QDir、QTemporaryDir、QFile、QTemporaryFile、QTextStream、QDataStream、QFileInfo、QFileSystemWatcher
声明:
本文作者原创,转载请附上文章出处与本文链接。
@
目录正文:
QDir
QDir 是 Qt 框架中用于处理文件和目录的类。它提供了一系列方法用于获取目录内容、操作文件和目录、以及执行各种文件系统操作。
常用成员函数:
exists()
: 判断目录是否存在。currentPath()
: 获取当前工作目录。setPath()
: 设置目录路径。dirName()
: 获取目录名。entryList()
: 获取目录中的文件和子目录列表。mkdir()
: 创建目录。rmdir()
: 删除目录。remove()
: 删除文件。
使用例子:
qDebug() << QStringLiteral("应用程序启动路径:") + QCoreApplication::applicationDirPath() << endl; // 和运行设置的Executable路径一致
QDir dir("example"); // 默认在 QCoreApplication::applicationDirPath() 路径下
if (!dir.exists())
qWarning("Cannot find the example directory");
else
qWarning("Succee find the example directory");
// 创建目录、文件
dir.mkdir("tmp"); // 在dir路径下新建目录tmp
if (!dir.cd("tmp")) // .../example/tmp 拼接后 exists()
qWarning("Cannot find the tmp in directory");
else
{
QFile file(dir.filePath("test.txt")); // ".../tmp/test.txt"
if (!file.open(QIODevice::ReadWrite))
qWarning("Cannot create the file %s", file.fileName());
}
// 获取目录下文件的信息并按文件由小到大进行排列
QDir dirLocal;
dirLocal.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
dirLocal.setSorting(QDir::Size | QDir::Reversed);
QFileInfoList list = dirLocal.entryInfoList();
qDebug() << " Bytes Filename";
for (int i = 0; i < list.size(); ++i)
{
QFileInfo fileInfo = list.at(i);
qDebug() << QString("%1 %2").arg(fileInfo.size(), 10).arg(fileInfo.fileName());
}
QFile
QFile是一个I/O设备,用来读写文本文件、二进制文件和资源。一个QFile可以单独使用通过IODevice读写功能直接进行读写,不过通常是使用QTextStream或QDataStream来配合读写数据,用流的方法进行文件读写。
常用成员函数:
exists()
: 判断文件是否存在。remove()
: 删除文件。copy()
: 复制文件内容到新文件。open()
: 使用设定的OpenMode模式打开文件。close()
: flush()后关闭文件。flush()
: 将所有缓冲的数据刷新到文件中。size()
: 返回文件的大小。pos()
: 返回数据写入或读取文件的位置,文件指针的位置。seek()
: 设置文件指针的位置。read()
: 读取文件数据。write()
: 写入数据到文件。
使用例子:
// 创建 QFile 对象,同时指定要操作的文件 QCoreApplication::applicationDirPath()
QFile file("demo.txt");
// 对文件进行读写操作
if(!file.open(QIODevice::ReadWrite | QIODevice::Text))
{
qDebug()<<"文件打开失败";
return;
}
// 向文件中写入两行字符串
file.write("麻麻,我想吃烤三姚\n");
file.write("吃,吃大份的");
// 刷新文件数据流
file.flush();
file.seek(0);
// 每次都去文件中的一行,然后输出读取到的字符串
char * str = new char[88];
qint64 readNum = file.readLine(str,88);
// 当读取出现错误(返回 -1)或者读取到的字符数为 0 时,结束读取
while((readNum !=0) && (readNum != -1)){
qDebug() << str;
readNum = file.readLine(str,88);
}
file.close();
QTemporaryDir、QTemporaryFile
QTemporaryDir
在 Qt 开发中,有时候会要创建一个临时目录,用于存储一些临时文件,在用完过后又要删除该目录,例如在临时文件夹内可创建临时数据文件,进行一些临时数据的读写,系统工作结束后目录自动删除,文件也跟着消失。
常用成员函数:
autoRemove()
: 如果QTemporaryDir处于自动删除模式,则返回true。errorString()
: 如果isValid()返回false,则此函数返回错误信息。filePath
: 返回临时目录中文件的路径名。isValid()
: 是否成功创建了临时目录。path()
: 返回临时目录的路径。remove()
: 删除临时目录。setAutoRemove
: 设置临时目录的删除模式,默认为自动删除模式。
使用例子:
QTemporaryDir dirT;
if (!dirT.isValid()) // 在创建对象后一定要使用isValid()来检查创建临时目录是否有效,不要使用exists()
{
qDebug() << "创建临时目录失败:" << dirT.errorString();
return;
}
QFile fileT(dirT.path() + "/Temporary.txt"); // 在临时目录下创建Temporary.txt
if(!fileT.open(QIODevice::ReadWrite | QIODevice::Text))
qDebug()<<"文件打开失败";
qDebug() << fileT.fileName();
// 读写Temporary.txt数据,工作结束后自动消失
fileT.close();
QTemporaryFile
用于安全创建唯一的临时文件。文件本身是通过调用open()创建的。临时文件的名称保证是唯一的(即,保证不会覆盖现有文件),并且在QTemporaryFile对象被销毁后,该文件随后将被删除。这是一项重要的技术,可以避免将数据存储在临时文件中的应用程序的数据损坏。文件名是自动生成的,或者是基于模板创建的,模板传递给QTemporaryFile的构造函数。
常用成员函数:
setAutoRemove()
: 设置临时文件在关闭时是否自动删除,默认为 true。autoRemove()
: 如果QTemporaryFile处于自动删除模式,则返回true。open()
: 打开临时文件以进行读取或写入操作。fileName()
: 获取临时文件的路径和文件名。fileTemplate()
: 获取临时文件的模板,可用于自定义临时文件的命名。createNativeFile()
: 在本地文件系统中创建临时文件。
使用例子:
QTemporaryFile tempFile; // 创建临时文件对象
if(!tempFile.open())
{
qDebug() << "Failed to create temporary file.";
return;
}
// tempFile.setAutoRemove(false);
QTextStream filestream(&tempFile); // 使用 QTextStream 写入临时文件
filestream.setCodec("UTF-8");
filestream << "Hello, World!"; // 写入临时文件
filestream.seek(0);
QString data;
data = filestream.readAll(); // 读取临时文件内容
tempFile.close(); // 关闭临时文件,此时临时文件不会被删除
QString filePath = tempFile.fileName(); // 获取临时文件路径和文件名
qDebug() << "Temporary file path: " << filePath << data;
// 程序结束,临时文件自动删除
QTextStream
使用Qt读写文本文件通常使用Qfile与QTextStream 结合,因为QTextStream 可以逐行读取,对于处理数据要相对方便一些。QTextStream类为读取和写入文本文件提供了方便的接口,文本文件是指纯文本格式存储的文件,例如: .txt、 .cpp、 .html、 .xml文件等都是纯文本文件。QTextStream还可和QBuffer、QTcpSocket、QUdpSocket等IO设备类结合使用。
常用成员函数:
QTextStream(FILE *fileHandle, )
: 构造函数绑定文件指针。readLine()
: 从流中读取一行文本,并将其作为QString返回。readAll()
: 读取流的全部内容,并将其作为QString返回。operator<<()
: 向QTextStream流中写入内容。atEnd()
: 判断是否到达文件末尾setAutoDetectUnicode()
: 将QTextStream对象设定为是否自动识别Unicode编码
使用例子:
// 输入文本流
QFile filein("test.txt");
if(filein.open(QFile::WriteOnly | QFile::Truncate))
{
QTextStream in(&filein); // 创建写入流
in << 3.1415926; // 写入数据
in << "Hello, World!";
}
filein.close();
/******************************************************/
// 输出文件流
QFile fileout("test.txt");
if(!fileout.open(QFile::ReadOnly | QIODevice::Text))
qDebug() << fileout.errorString();
QTextStream out(&fileout); // 创建输出流
while(!out.atEnd())
{
QString oneLine = out.readLine(); // 读取一行
qDebug() << oneLine;
}
fileout.close();
QDataStream
与QTextStream类似又不同的点在于QDataStream是提供方便的接口来读取和写入二进制流文本.dat文件,广义上来说,文字、图片、声音、视频都可以保存为“.dat”文件,它们会以二进制的形式储存在“.dat”文件中,QDataStream允许以特定格式读取和写入二进制数据,如整数、浮点数、字符串等,QDataStream可以跨平台使用,并支持大多数操作系统和体系结构。
常用成员函数:
QDataStream(QIODevice *d)
: 构造函数绑定文件指针。operator<<()
: 向QDataStream流中写入内容。operator>>()
: 从 QDataStream 读取数据setVersion()
: 设置 QDataStream 的数据版本。setFloatingPointPrecision()
: 设置浮点数的精度。
使用例子:
QFile DataFile("test.dat");
DataFile.open(QIODevice::ReadWrite); // 截断删除
QDataStream stream(&DataFile);
stream << QString("sir this way"); // 输入二进制数据
stream << (qint64)250;
DataFile.flush(); // 要 flush一下 不然实际没内容
DataFile.seek(0); // 还要把文件指针移到最前
QString str;
qint64 num;
stream >> str >> num; // 读取二进制数据
qDebug() << str << " | " << num;
DataFile.close(); // 虽然QFile会自动关闭
QSettings
QSettings用于读写.ini文件,.ini 文件是初始化文件,除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户的要求。.ini 可以用来存放软件信息,注册表信息等
常用成员函数:
setValue()
: 将设置键的值设置为value。如果键已经存在,则覆盖之前的值。value()
: 返回设置键的值。。allKeys()
: 返回可以使用QSettings对象读取的所有键(包括子键)的列表。remove()
: 删除设置键和键的任何子设置。contains()
: 如果存在一个名为key的设置,则返回true;否则返回false。
使用例子
.ini文件格式
[Section1 Name] ; 节
Key11=value11 ; 参数(建 = 值) // .ini文件的注解方式
Key12=value12
[Section2 Name]
Key21=value21
Key22=value22
// 写入.ini文件
QSettings *configWrite = new QSettings("config.ini", QSettings::IniFormat);
configWrite->setValue("ip/first", "192.168.0.1");// 向ini文件的ip节写入内容,ip节下的第一个参数
configWrite->setValue("ip/second", "127.0.0.1"); // 已存在节和参数为替换val,若没有存在则为新建赋值
configWrite->setValue("port/open", "8888");
// 写入完成后删除指针
delete configWrite;
// 读取.ini文件
QSettings *configRead = new QSettings("config.ini", QSettings::IniFormat);
QString ipResult = configRead->value("/ip/second").toString();
QString portResult = configRead->value("/port/open").toString();
qDebug() << ipResult;
qDebug() << portResult;
// 删除key
configRead->remove("/ip/first");
// 输出全key
QStringList keylist = configRead->allKeys();
qDebug() << keylist;
// 读取完成后删除指针
delete configRead;
QFileInfo:
QFileInfo类为我们提供了系统无关的文件信息,包括文件的名字和在文件系统中位置,文件的访问权限,是否是目录或符合链接等等。并且,通过这个类,可以修改文件的大小和最后修改、读取时间。同时,QFileInfo类也可以用来取到Qt 资源的相关信息。
常用成员函数:
exists()
、size()
、absoluteFilePath()
: 文件状态信息,存在,大小,路径。isFile()
、isDir()
、isSymLink()
: 文件类型信息,是否为文件,文件夹,符号链接。isReadable()
、isWritable()
、isExecutable()
: 文件权限信息,可读,可写,可执行。
使用例子
QFileInfo fileInfo("demo.txt"); // 可以是路径名,也可以是QFile、QDir的指针
qDebug() << "大小:" << fileInfo.size();
qDebug() << "路径:" << fileInfo.absoluteFilePath();
qDebug() << "文件?:" << fileInfo.isFile();
qDebug() << "文件夹?:" << fileInfo.isDir();
qDebug() << "可读?:" << fileInfo.isReadable();
qDebug() << "可写?:" << fileInfo.isWritable();
qDebug() << "可执行?:" << fileInfo.isExecutable();
QFileSystemWatcher:
QFileSystemWatcher通过观察指定路径的列表来监视文件系统中文件和目录的更改。
常用成员函数:
addPath()
: 如果路径存在,则向文件系统监视程序添加路径。files()
: 返回正在监视的文件的路径列表。directories()
: 返回正在监视的目录的路径列表。removePath()
: 从文件系统监视程序中删除指定的路径。directoryChanged()
、fileChanged()
: 文件夹、文件发生改变时发送的信号singnal函数。
使用例子
QFileSystemWatcher watcher;
watcher.addPath("demo.txt"); // monitoring file
watcher.addPath("example"); // monitoring directory
qDebug() << watcher.files() << endl << watcher.directories();
/****************************************************************/
connect(&watcher, SIGNAL(fileChanged(const QString&)), this, SLOT());
connect(&watcher, SIGNAL(directoryChanged(const QString&)), this, SLOT());
over~
推荐阅读:
https://www.cnblogs.com/sr0808/
标签:文件,QSettings,文件目录,Qt,QFile,QDataStream,目录,QTextStream From: https://www.cnblogs.com/sr0808/p/17772461.html