Qt开发总结(23)——文件系统

文件读写是大多编程语言所具备的基本功能之一。C语言中有FILE *指针,C++语言中有fstream类。这归根到底是因为操作系统在设计之初就定义了文件系统是其基本要素之一。Qt中也封装了基于C++的跨平台的文件系统类,这些类的功能非常友好,以致于你可能使用了Qt的文件功能类后会对C++的fstream有点陌生了。本篇总结将总结Qt这一非GUI功能——文件系统。

相关的类

描述

QFile

文件接口类

QFileInfo

文件信息类

QDir

路径类

QTemporaryFile

创建临时文件

QTemporaryDir

创建临时目录

QTextStream

文本流

QDataStream

数据流

QFile IO读写文本文件

QFile直接与IO设备打交道,进行文件读写操作。如下代码显示了用QFile直接按行读取文本文件的方法:

      QFile file("in.txt");
      if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
          return;

      while (!file.atEnd()) {
          QByteArray line = file.readLine();
          process_line(line);
      }

 

其中,QIODevice::ReadOnly表示以只读的方式读取,QIODevice::Text表示以文本的方式读取,这与C++的fstream中的定义类似。类似的IO操作还有:

Constant

Value

Description

QIODevice::NotOpen

0x0000

The device is not open.

QIODevice::ReadOnly

0x0001

The device is open for reading.

QIODevice::WriteOnly

0x0002

The device is open for writing. Note that this mode implies Truncate.

QIODevice::ReadWrite

ReadOnly | WriteOnly

The device is open for reading and writing.

QIODevice::Append

0x0004

The device is opened in append mode so that all data is written to the end of the file.

QIODevice::Truncate

0x0008

If possible, the device is truncated before it is opened. All earlier contents of the device are lost.

QIODevice::Text

0x0010

When reading, the end-of-line terminators are translated to '\n'. When writing, the end-of-line terminators are translated to the local encoding, for example '\r\n' for Win32.

类似的,通过IO直接写文件的话,仅需要将打开方式改为QIODevice::WriteOnly或QIODevice::Append即可。两者的区别是前者暗含了QIODevice::Truncate,即删除文件原有内容,而后者则会在尾部继续填写。

即可:

          

      QFile file("out.txt");
      if (!file.open(QIODevice:: WriteOnly | QIODevice::Text))
          return;

      QByteArray data;
      file.write(data, data.length());
      file.close();

 

QFile和QTextStream读写文本文件

QTextStream和QFile结合,为数据读写提供了一些更加方便的类。如下通过QTextStream文本流的方式读取文本文件:

      

      QFile file("in.txt");
      if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
          return;

      QTextStream in(&file);
      while (!in.atEnd()) {
          QString line = in.readLine();
          process_line(line);
      }

 

通过文本流写入文件时,其使用方式和fstream中的ofstream类似,即通过“<<”号实现:

           

      QFile file("out.txt");
      if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
          return;

      QTextStream out(&file);
      out << "The magic number is: " << 49 << "\n";
	  file.close();

 

二进制文件读写

Qt中使用QFile和QDataStream进行二进制文件读写。QFile同样负责文件IO,而QDataStream则以数据流的方式读写二进制文件内容。首先来看写入二进制文件:

          

      QFile file("out.dat");
      if (!file.open(QIODevice:: WriteOnly))
          return;
      QDataStream stream(&file);
      stream.setVersion(QDataStream::Qt_5_9);
      stream<<5;
      stream<<0xA6;
      file.close();

 

相应的,读取二进制文件的方法是:

           

      QFile file("in.dat");
      if (!file.open(QIODevice::ReadOnly))
          return;

      QDataStream stream(&file);
      stream.setVersion(QDataStream::Qt_5_9);
      int a,b;
      stream >> a;
      stream >> b;
      file.close();

 

另外,我们也可以用QDataStream的其他接口函数,如readRawData()和writeRawData()读写原始二进制数据。也可以用readAll接口函数直接读取不论是文本还是二进制文件的所有数据(前提是内存大于文件大小)。QFile基类QFileDevice还提供了map接口来进行文件映射,进而在内存中处理数据。这同样需要考虑内存限制,而且对于现在的告诉固态硬盘来说,文件映射和IO 读取的速度差距越来越小,甚至可以忽略不计了。

文件信息

文件系统操作除了简单的读写外,我们通常要对文件的信息进行管理。在dialog一章中总结了QFileDialog的一些内容,涉及了一部分内容。这里再介绍其他几个相关的类。

QCoreApplication可用于提取应用程序路径、程序名等文件信息;

QFile还可以对文件进行复制、删除等操作;

QFileInfo用于提取文件信息,包括路径、文件名和后缀等;

QDir用于提取目录和文件列表,创建和删除目录以及文件重命名等操作。

QTemporaryFile和QTemporaryDir用以创建临时文件和临时目录;

这涉及到一些列文件系统接口函数,这里挑选常用的进行罗列:

接口

所属类

功能

applicationDirPath()

QCoreApplication

返回应用程序启动路径

applicationFilePath()

QCoreApplication

返回应用程序目录

applicationName()

QCoreApplication

返回应用程序名称

copy()

QFile

复制文件

remove()

QFile

删除文件

rename()

QFile

重命名文件

absoluteDir()

QFileInfo

返回绝对路径QDir

absoluteFilePath()

QFileInfo

返回带有文件名的绝对路径

absolutePath()

QFileInfo

返回绝对路径,不带文件名

baseName()

QFileInfo

返回文件基名,第一个"."之前的名字

completeBaseName()

QFileInfo

返回文件基名,最后一个"."之前的名字

suffix()

QFileInfo

最后一个"."之后的后缀

completeSuffix()

QFileInfo

第一个"."之后的后缀

fileName()

QFileInfo

返回去除路径的文件名

filePath()

QFileInfo

返回包含路径的文件名

tempPath()

QDir

返回临时文件目录名称

rootPath()

QDir

返回根目录名称

homePath()

QDir

返回主目录名称

currentPath()

QDir

返回当前目录名称

absoluteFilePath()

QDir

返回当前目录下一个文件的绝对路径文件名

absolutePath()

QDir

返回当前目录的绝对路径

canonicalPath()

QDir

返回当前目录的标准路径

dirName()

QDir

返回最后一级目录名称

filePath()

QDir

返回下一个文件名录名

mkdir()

QDir

创建子目录

remove()

QDir

删除当前目录下的文件

rename()

QDir

重命名某文件

rmdir()

QDir

删除指定的目录

setFilter()

QDir

设置文件过滤器

setAutoRemove()

QTemporaryFile/Dir

设置是否自动删除

path()

QTemporaryFile/Dir

返回创建的临时目录名称

remove()

QTemporaryFile/Dir

删除临时目录及下面所有文件

例子

请到本人下载频道下载:https://download.csdn.net/download/bjtuwayne/12075095

发布了76 篇原创文章 · 获赞 63 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/bjtuwayne/article/details/103835170
今日推荐