当前位置: 代码迷 >> 综合 >> Qt文档译:QFile
  详细解决方案

Qt文档译:QFile

热度:71   发布时间:2023-10-30 18:38:01.0

0.详细说明.
QFile类提供了一个用于读取和写入文件的接口.它是一个用于读取和写入文本.二进制文件和资源文件的输入输出设备.它可以被单独使用,也可以更方便地使用QTextStream或QDataStream.我们可以通过构造函数通过文件路径加载文件,也可以随时通过setFileName()方法来改变文件.QFile类希望文件路径的分隔符是’/’,而不是依赖操作系统,不支持其他的分隔符,例如’\’.

你可以使用exists()方法判断指定文件是否存在,使用remove()方法来删除一个文件(其他更细节的文件属性由QFileInfo和QDir类提供).
文件通过open()方法打开,close()方法关闭,flush()方法刷新缓冲区.数据流通常是由QTextStream和QDataStream两个类来读取和写入的.除此之外,QIODevice输入输出设备类也提供了read(),readLine(),readAll(),write()方法来对数据流进行操作.QFile类还继承了QIODevice的getChar(),putChar(),ungetChar()等方法依次处理字符.

文件的字节大小可以由size()方法来得到,你可以使用pos()方法来获取当前的位置,也可以使用seek()方法来移动到新的位置,这里的位置指的是数据流的位置,你可以使用atEnd()方法来判断是否已经读完了所有的数据.(ps:对于文件读取和写入,我一般使用C语言的文件操作…不太习惯使用别的.)

下面有个例子:

    //首先直接使用文件名初始化file对象.这里的"in.txt"必须放在当前工作目录中.否则会打开失败.QFile file("in.txt");//判断文件是否打开成功,以文本和只读的模式打开.文本模式是将windows系统下的\r\n转化为'\n'.if (!file.open(QIODevice::ReadOnly | QIODevice::Text))return;//只要文件没有读完.while (!file.atEnd()) {//每次读取一行.返回值是字节数组.QByteArray line = file.readLine();process_line(line);}

除了使用QFile来读取文本外,读取文本文件最好还是使用QTextStream.这个类是专门处理文本数据流来使用的.下面有个例子:

    //这里照常.QFile file("in.txt");if (!file.open(QIODevice::ReadOnly | QIODevice::Text))return;//创建一个文本数据流对象.使用&file初始化,让流对象和文件相连接.QTextStream in(&file);while (!in.atEnd()) {//读取出来的内容为字符串.QString line = in.readLine();process_line(line);}

QTextStream负责将存储在磁盘上的8位数据转换成16位Unicode QString.默认情况下,它假定用户系统的本地8位编码被使用(例如,在大多数基于unix的操作系统上使用UTF-8).QTextStream类的其他内容就不在赘述了,将会在QTextStream这个类中专门说明.

1.所有函数方法说明
//通过指定父类或文件路径构造文件对象.
1.1->QFile::QFile(const QString & name);
1.2->QFile::QFile(QObject * parent);
1.3->QFile::QFile(const QString & name, QObject * parent);

1.4->bool QFile::copy(const QString & newName);
1.5->bool QFile::copy(const QString & fileName, const QString & newName) [static]

将当前由fileName()指定的文件复制到名为newName的文件中,如果操作成功则返回true,操作失败则返回false,如果newName已存在或源文件未被关闭也返回false.
//sample1:
QFile file("1.txt");
qDebug() << file.copy("../2.txt");
//在1.txt文件已关闭并且../2.txt文件不存在的情况下.把1.txt拷贝一份复制到上一层的路径中.返回true.
//sample2:
qDebug() << QFile::copy("1.txt", "../../2.txt");
//通过静态方法直接拷贝指定文件到指定路径.

//返回给定localFileName的Unicode版本.
1.6->QString QFile::decodeName(const QByteArray & localFileName) [static]
1.7->QString QFile::decodeName(const char * localFileName) [static]
//将文件名转换成由用户所在地区确定的本地8位编码。这对于用户选择的文件名来说已经足够了。硬编码到应用程序中的文件名应该只使用7位ASCII文件名字符。
1.8->QString QFile::decodeName(const char * localFileName) [static]

//判断指定文件是否存在.
1.9->bool QFile::exists(const QString & fileName) [static]
1.10->bool QFile::exists() const

//返回值为bool类型可以判断是否存在.
qDebug() << QFile::exists("1.txt");

//返回构造的QFile对象的文件名.可以通过setFileName()方法重新设置.
1.11->QString QFile::fileName() const [virtual]
1.12->void QFile::setFileName(const QString & name)

//sample:
QFile file;
QDir::setCurrent("/tmp");
//设置文件名.
file.setFileName("readme.txt");
//设置当前工作路径.
QDir::setCurrent("/home");
file.open(QIODevice::ReadOnly);  //这里实际打开的文件路径为:"/home/readme.txt" under Unix/Linux.

//创建一个名为linkName的链接,该链接指向当前由fileName()指定的文件。链接是什么取决于底层文件系统(在Windows上是一个快捷方式,还是Unix上的符号链接)。返回true,如果成功;否则返回false。
这个函数不会覆盖文件系统中已经存在的实体;在这种情况下,link()将返回false和set error()以返回RenameError。
注意:为了在Windows上创建一个有效的链接,linkName必须有一个.lnk文件扩展名。
1.13->bool QFile::link(const QString & linkName)
1.14->bool QFile::link(const QString & fileName, const QString & linkName) [static]

//以QIODevice输入输出设备类的枚举变量作为参数,来打开文件.注意:在WriteOnly或ReadWrite模式中,如果相关文件还不存在,那么这个函数将尝试在打开它之前创建一个新文件.
1.15->bool QFile::open(OpenMode mode) [virtual]
1.16->bool QFile::open(FILE * fh, OpenMode mode, FileHandleFlags handleFlags = DontCloseHandle)
1.17->bool QFile::open(int fd, OpenMode mode, FileHandleFlags handleFlags = DontCloseHandle)

//sample:
#include <stdio.h>
void printError(const char* msg)
{QFile file;file.open(stderr, QIODevice::WriteOnly);file.write(msg, qstrlen(msg));        // write to stderrfile.close();
}

//返回指定文件的权限.可读可写可执行等.在Linux系统上对权限的区分更准确.
1.18->Permissions QFile::permissions() const [virtual]
1.19->Permissions QFile::permissions(const QString & fileName) [static]
1.20->bool QFile::setPermissions(Permissions permissions) [virtual]
1.21->bool QFile::setPermissions(const QString & fileName, Permissions permissions) [static]

//删除指定文件.前提源文件必须被关闭.
1.22->bool QFile::remove()
1.23->bool QFile::remove(const QString & fileName) [static]

//sample1:
QFile file("1.txt");    
file.remove();
//sample2:
QFile::remove("1.txt");

//修改文件名.如果新的文件名存在.则返回false.前提源文件必须被关闭.QFile不会去覆盖已存在的文件.
1.24->bool QFile::rename(const QString & newName)
1.25->bool QFile::rename(const QString & oldName, const QString & newName) [static]

//对文件的大小进行截取,以为字节为单位.
1.26->bool QFile::resize(qint64 sz) [virtual]
1.27->bool QFile::resize(const QString & fileName, qint64 sz) [static]

//sample:
//源文件的内容是hello.共5个字节.
QFile file("1.txt");
qDebug() << file.size();
//截取文件的大小,只截取3个字节.所以最后源文件的内容只有:hel.如果重新设置的数字大于文件的内容,则以空字符填充.
file.resize(3);

//返回文件或目录的绝对路径——一个符号链接(或Windows上的快捷方式)指向,或者如果对象不是一个符号链接,则返回一个空字符串。
这个名称可能不代表现有的文件;它只是一个字符串。如果symlink指向现有的文件,则存在()返回true.没用过…
1.28->QString QFile::symLinkTarget(const QString & fileName) [static]
1.29->QString QFile::symLinkTarget() const

2.signals
QFile类不像其他的QIODevice实现,比如QTcpSocket,它不会发出about toclose()、bytes写入()或readyRead()信号。这个实现细节意味着QFile不适合阅读和编写某些类型的文件,比如Unix平台上的设备文件.

3.不同平台的使用问题.
在linux/mac OS X和Windows上,文件权限的处理方式不同。在Linux上的一个不可写的目录中,不能创建文件。在Windows中,情况并非总是如此,例如,“我的文档”目录通常不是可写的,但是仍然可以在其中创建文件.(ps:Linux系统下的文件系统是权限分明的,分别为rwx,r为read,w为write,x为execute,对于user和groups和others的权限又是不同的.所以说Linux的权限非常的明确,不是你想创建文件就可以创的.)