QFile 类
QFile类提供用于读取和写入文件的接口。
Header: | #include < QFile > |
---|---|
qmake: | QT += core |
Inherits: | QFileDevice |
Inherited By: | QTemporaryFile |
详述
QFile是用于读取和写入文本以及二进制文件和资源的I/O设备。 QFile可以单独使用,或者更方便地与QTextStream或QDataStream一起使用。
文件名通常在构造函数中传递,但是可以随时使用setFileName() 进行设置。 QFile希望文件分隔符为’/‘,而不管操作系统是什么。不支持使用其他分隔符(例如’ \ ')。
可以使用exist() 检查文件是否存在,并使用remove() 删除文件。(与更高级的文件系统相关的操作由QFileInfo和QDir提供。)
使用open() 打开文件,使用close() 关闭文件,然后使用flush() 刷新文件。通常使用QDataStream或QTextStream读写数据,但是您也可以调用QIODevice继承的函数read() ,readLine() ,readAll() ,write() 。 QFile还继承了getChar() ,putChar() 和ungetChar() ,它们一次只工作一个字符。
文件的大小由size() 返回。您可以使用pos() 获取当前文件位置,或使用seek() 移至新文件位置。如果到达文件末尾,则atEnd() 返回true。
直接读取文件
以下示例逐行读取文本文件:
QFile file("in.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
while (!file.atEnd()) {
QByteArray line = file.readLine();
process_line(line);
}
传递给open() 的QIODevice :: Text标志告诉Qt将Windows样式的行终止符(“ \ r \ n”)转换为C++样式的终止符(“ \ n”)。
默认情况下,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);
}
QTextStream负责将存储在磁盘上的8位数据转换为16位Unicode QString。 默认情况下,它假定使用用户系统的本地8位编码(例如,在大多数基于unix的操作系统上为UTF-8;有关详细信息,请参见QTextCodec :: codecForLocale() )。 可以使用QTextStream :: setCodec() 进行更改。
要编写文本,我们可以使用operator <<() ,将其重载以在左侧获取QTextStream,在右侧获取各种数据类型(包括QString):
QFile file("out.txt");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;
QTextStream out(&file);
out << "The magic number is: " << 49 << "\n";
QDataStream与之类似,您可以使用operator <<() 写入数据,并使用operator >>() 读回数据。有关详细信息,请参见类文档。
当您使用QFile,QFileInfo和QDir通过Qt访问文件系统时,可以使用Unicode文件名。在Unix上,这些文件名被转换为8位编码。如果要使用标准C++ API(< cstdio >或< iostream >)或特定于平台的API来访问文件而不是QFile,则可以使用encodeName() 和encodeName() 函数在Unicode文件名和8位文件名之间进行转换。
在Unix上,有一些特殊的系统文件(例如/ proc中的文件),对于这些文件,size() 始终返回0,但是您仍然可以从该文件中读取更多数据;数据是直接响应您调用read() 而生成的。但是,在这种情况下,您不能使用atEnd() 来确定是否还有更多数据要读取(因为atEnd() 对于声称大小为0的文件将返回true)。相反,您应该重复调用readAll() ,或重复调用read() 或readLine() 直到无法读取更多数据为止。下一个示例使用QTextStream逐行读取/ proc / modules:
QFile file("/proc/modules");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QTextStream in(&file);
QString line = in.readLine();
while (!line.isNull()) {
process_line(line);
line = in.readLine();
}
信号
与其他QIODevice实现(例如QTcpSocket)不同,QFile不会发出aboutToClose() ,bytesWritten() 或readyRead() 信号。 此实现细节表示QFile不适合读写某些类型的文件,例如Unix平台上的设备文件。
平台特定问题
在类似Unix的系统和Windows上,文件权限的处理方式有所不同。 在类似Unix的系统上的不可写目录中,无法创建文件。 在Windows上,情况并非总是如此,例如,“我的文档”目录通常是不可写的,但仍可以在其中创建文件。
Qt对文件权限的理解是有限的,这尤其会影响QFile :: setPermissions() 函数。 在Windows上,Qt将仅设置旧版只读标志,并且仅在未传递Write *标志时设置该标志。 Qt不会操纵访问控制列表(ACL),这使得该功能对NTFS卷几乎没有用。 对于使用VFAT文件系统的USB记忆棒,它可能仍然有用。 POSIX ACL也不被操纵。
另请参见QTextStream,QDataStream,QFileInfo,QDir和Qt资源系统。
公共类型
-
typedef DecoderFn
这是具有以下签名的函数的指针的typedef:QString myDecoderFunc(const QByteArray &localFileName);
公共函数
-
QFile(const QString &name, QObject *parent)
-
QFile(QObject *parent)
-
QFile(const QString &name)
-
QFile()
-
virtual ~QFile()
-
bool copy(const QString &newName)
-
bool exists() const
-
bool link(const QString &linkName)
创建一个名为linkName的链接,该链接指向fileName() 当前指定的文件。 什么是链接取决于基础文件系统(在Windows上是快捷方式还是在Unix上是符号链接)。 如果成功,则返回true;否则,返回false。 否则返回false。
该功能不会覆盖文件系统中已经存在的实体; 在这种情况下,link() 将返回false并将error() 设置为返回RenameError。注意:要在Windows上创建有效的链接,linkName必须具有.lnk文件扩展名。
另请参见setFileName() 。
-
bool moveToTrash()
将fileName() 指定的文件移动到垃圾箱。 如果成功,则返回true,并将fileName() 设置为可在回收站中找到文件的路径; 否则返回false。注意:在系统API不报告垃圾桶中文件位置的系统上,一旦文件移动,fileName() 将设置为空字符串。 在没有垃圾桶的系统上,此函数始终返回false。
-
bool open(FILE *fh, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)
-
bool open(int fd, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)
-
bool remove()
-
bool rename(const QString &newName)
-
void setFileName(const QString &name)
-
QString symLinkTarget() const
返回由fileName指定的符号链接(或Windows上的快捷方式)所引用的文件或目录的绝对路径,或者如果fileName与符号链接不对应,则返回空字符串。
该名称可能不代表现有文件; 它只是一个字符串。 如果符号链接指向现有文件,则QFile :: exists() 返回true。
重新实现的公共函数
- virtual QString fileName() const override
- virtual bool open(QIODevice::OpenMode mode) override
- virtual QFileDevice::Permissions permissions() const override
- virtual bool resize(qint64 sz) override
- virtual bool setPermissions(QFileDevice::Permissions permissions) override
- virtual qint64 size() const override
静态公用函数
- bool copy(const QString &fileName, const QString &newName)
- QString decodeName(const QByteArray &localFileName)
- QString decodeName(const char *localFileName)
- QByteArray encodeName(const QString &fileName)
- bool exists(const QString &fileName)
- bool link(const QString &fileName, const QString &linkName)
- bool moveToTrash(const QString &fileName, QString *pathInTrash = nullptr)
- QFileDevice::Permissions permissions(const QString &fileName)
- bool remove(const QString &fileName)
- bool rename(const QString &oldName, const QString &newName)
- bool resize(const QString &fileName, qint64 sz)
- bool setPermissions(const QString &fileName, QFileDevice::Permissions permissions)
- QString symLinkTarget(const QString &fileName)