Qt 文件目录操作 QDir、QFile、QTemporaryDir/File、QTextStream、QDataStream、QSettings、QFileInfo、QFileSystemWatch

发布时间 2023-10-18 15:21:55作者: 空手只套小鱼干

在这里插入图片描述

摘要:

  这一篇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/