天天看点

58 QT读取和写入文件

文件操作(QFile)

QFile类提供了一个用于读写文件的接口,它是一个可以用来读写文本文件、二进制文件和Qt资源的I/O设备。

QFile可以单独使用,也可以和QTextStream或者QDataStream一起使用,这样会更方便。

一般在构建QFile对象时便指定文件名,当然也可以使用setFileName()进行设置。无论在哪种操作系统上,文件名路径中的文件分隔符都需要使用‘/’符号。

可以使用exists()来检查文件是否存在,remove()来删除一个文件。更多与文件系统相关的高级操作在QFileInfo和QDir类中提供。

一个文件可以使用open()打开,使用close()关闭,使用flush()刷新。文件的数据读写一般使用QDataStream或者QTextStream来完成,不过也可以使用继承自QIODevice类的一些函数,比如read()、readLine()、readAll()和write(),还有一次只操作一个字符的getChar()、putChar()和ungetChar()等函数。可以使用size()函数来获取文件的大小,使用seek()来定位到文件的任意位置,使用pos()来获取当前的位置,使用atEnd()来判断是否到达了文件的末尾。

文件信息(QFilelnfo)

QFilelnfo 类提供了与系统无关的文件信息,包括文件的名称、在文件系统中的位置(路径)、文件的访问权限以及是否是一个目录或者符号链接等 。 QFilelnfo也可以获取文件的大小和最近一次修改/读取的时间,还可以获取 Qt 资源的相关信息 。 QFilelnfo 指向的文件可以在 QFileinfo 对象构建时设置,或者以后使用 setFile()来设置。可以使用以exists()来查看文件是否存在,使用 size ()获取文件的大小。

QFileInfo可以使用相对(relative)路径或者绝对(absolute)路径来指向一个文件,还可以使用makeAbsolute()来将一个相对路径转换为绝对路径。

文件的类型可以使用isFile()、isDir()和isSymLink()来获取。 可以分别使用path()和fileName()来获取文件的路径和文件名,还可以使用baseName()来获取文件名中的基本名称,使用suffix()来获取文件名的后缀,使用completeSuffix()来获取复合后缀。

文件的日期可以使用created()、lastModified()和lastRead()来返回;

访问权限可以使用isReadable()、isWritable()和isExecutable()来获取;

文件的所有权可以使用owner()、ownerId()、group()和groupId()来获取。

临时文件(QTemporaryFile)

QTemporaryFile类是一个用来操作临时文件的I/O设备,它可以安全地创建一个唯一的临时文件。当调用open()函数时便会创建一个临时文件,临时文件的文件名可以保证是唯一的,当销毁QTemporaryFile对象时,该文件会被自动删除掉。

在调用open()函数时,默认会使用QIODevice::ReadWrite模式,可以像下面的代码这样来使用QTemporaryFile类:

QTemporaryFile file;
if (file.open()) {
    // 在这里对临时文件进行操作,file.fileName()可以返回唯一的文件名
}      

在调用了close()函数后重新打开QTemporaryFile是安全的,只要QTemporaryFile的对象没有被销毁,那么唯一的临时文件就会一直存在而且由QTemporaryFile内部保持打开。临时文件默认会生成在系统的临时目录里,这个目录的路径可以使用QDir::tempPath()来获取。

目录(QDir)

QDir类用来访问目录结构及其内容,可以操作路径名、访问路径和文件相关信息以及操作底层的文件系统,还可以访问Qt的资源系统。Qt使用“/”作为通用的目录分隔符和URLs的目录分隔符,如果使用“/”作为目录分隔符,Qt会自动转换路径来适应底层的操作系统。QDir可以使用相对路径或者绝对路径来指向一个文件,使用绝对路径的例子:    

QDir("/home/user/Documents");
QDir("C:/Documents and Settings");      
  • 可以使用isRelative()和isAbsolute()来判断一个QDir是否使用了相对路径或者绝对路径。
  • 一个目录的路径可以使用path()函数获取,使用setPath()函数可以设置新的路径,使用absolutePath()函数可以获取绝对路径。
  • 目录名可以使用dirName()函数获取,如果QDir代表当前目录,那么会返回“.”。
  • 目录的路径也可以使用cd()和cdUp()函数来改变,当使用一个存在的目录的名字来调用cd()后,QDir对象就会转换到指定的目录;而cdUp()会跳转到父目录。
  • 可以使用mkdir()来创建目录,使用rename()进行重命名,使用rmdir()删除目录。

如何输出一个文件下面的文件名?

可以应用一个名称过滤器(name filters)来使用通配符(wildcards)指定一个模式进行文件名的匹配,一个属性过滤器可以选取条目的属性并且可以区分文件和目录,还可以设定排序顺序。名称过滤器就是一个字符串列表,可以使用setNameFilters()函数来设置,例如下面的代码在QDir上使用了三个名称过滤器来确保只有以通常用于C++源文件的扩展名结尾的文件才会被列出:

QStringList filters;
filters << "*.cpp" << "*.cxx" << "*.cc";      
//获取当前程序文件夹下都有什么文件
QDir dir(QDir::currentPath());
QStringList filters;
filters<<"*.cpp"<<"*.h"<<"*.txt";
dir.setNameFilters(filters);
qDebug()<<dir.entryList(filters, QDir::Files);