QFile 类
在一个QFile类提供一个接口,用于读取和写入文件。更多...
Header: | #include <QFile> |
qmake: | QT += core |
Inherits: | QFileDevice |
Inherited By: |
注意:此类中的所有函数都是可重入的。
公共类别
typedef | DecoderFn |
公共函数
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) |
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 |
虚拟成员函数
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) |
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) |
详细说明
QFile是用于读取和写入文本以及二进制文件和 resources的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上,有一些特殊的系统文件(例如in中/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();
}
Signals
与其他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和The Qt Resource 系统。
会员类型文件
typedef QFile :: DecoderFn
这是指向具有以下签名的函数的指针的typedef:
QString myDecoderFunc(const QByteArray &localFileName);
另请参见setDecodingFunction()。
会员功能文档
QFile :: QFile(const QString&name,QObject * parent)
构造一个具有给定父对象的新文件对象,以表示具有指定名称的文件。
QFile :: QFile(QObject * parent)
使用给定的parent构造一个新的文件对象。
QFile :: QFile(const QString&name)
构造一个新的文件对象来表示具有给定名称的文件。
QFile :: QFile()
构造一个QFile对象。
[virtual]
QFile :: 〜QFile()
销毁文件对象,必要时将其关闭。
bool QFile::copy(const QString &newName)
将当前由fileName()指定的文件复制到名为newName的文件中。返回true
成功 否则返回false
。
请注意,如果已经存在名称为newName的文件,则copy()返回false
(即QFile不会覆盖它)。
源文件在复制之前已关闭。
另请参见setFileName()。
[static] bool QFile::copy(const QString &fileName, const QString &newName)
这是一个重载功能。
将文件fileName复制到newName。返回true
成功 否则返回false
。
如果名称为newName的文件已经存在,则copy()返回false
(即QFile不会覆盖它)。
另请参见rename().
[static]
QString QFile :: decodeName(const QByteArray& localFileName)
这与使用localFileName的QFile :: encodeName()相反。
另请参见encodeName()。
[static]
QString QFile :: decodeName(const char * localFileName)
这是一个重载功能。
返回给定localFileName的Unicode版本。有关详细信息,请参见encodeName()。
[static]
QByteArray QFile :: encodeName(const QString& fileName)
将fileName转换为由用户的语言环境确定的本地8位编码。这足以满足用户选择的文件名。硬编码到应用程序中的文件名只能使用7位ASCII文件名字符。
另请参见encodeName().
[static] bool QFile::exists(const QString &fileName)
返回true
由fileName指定的文件是否存在;否则返回false
。
注意:如果fileName是指向不存在文件的符号链接,则返回false。
bool QFile::exists() const
这是一个重载功能。
返回true
由fileName()指定的文件是否存在;否则返回false。否则返回false
。
另请参见fileName()和setFileName()。
[override virtual]
QString QFile :: fileName()const
重新实现:QFileDevice :: fileName()const。
返回由setFileName()或QFile构造函数设置的名称。
另请参见setFileName()和QFileInfo :: fileName()。
bool QFile::link(const QString &linkName)
创建一个名为linkName的链接,该链接指向fileName()当前指定的文件。什么是链接取决于底层文件系统(在Windows上是快捷方式还是在Unix上是符号链接)。返回true
成功 否则返回false
。
该功能不会覆盖文件系统中已经存在的实体;在这种情况下,link()
将返回false并将error()设置为返回RenameError。
注意:要在Windows上创建有效的链接,linkName必须具有.lnk
文件扩展名。
另请参见setFileName()。
[static] bool QFile::link(const QString &fileName, const QString &linkName)
这是一个过载功能。
创建一个名为linkName的链接,该链接指向文件fileName。什么是链接取决于底层文件系统(在Windows上是快捷方式还是在Unix上是符号链接)。返回true
成功 否则返回false
。
另请参阅link().
[virtual] bool QFile::open(OpenMode mode)
重新实现:QIODevice :: open(QIODevice :: OpenMode模式)。
使用OpenMode 模式打开文件,如果成功,则返回true;否则,返回true。否则为假。
该模式必须的QIODevice ::只读,的QIODevice ::只写,或QIODevice中::读写。它还可能具有其他标志,例如QIODevice :: Text和QIODevice :: Unbuffered。
注意:在WriteOnly或ReadWrite模式下,如果相关文件尚不存在,则此函数将尝试在打开新文件之前创建它。
另请参见QIODevice :: OpenMode和setFileName()。
bool QFile::open(FILE *fh, OpenMode mode, FileHandleFlags handleFlags = DontCloseHandle)
这是一个重载功能。
在给定模式下打开现有文件句柄fh。handleFlags可用于指定其他选项。返回成功 否则返回。true
false
例:
#include <stdio.h>
void printError(const char* msg)
{
QFile file;
file.open(stderr, QIODevice::WriteOnly);
file.write(msg, qstrlen(msg)); // write to stderr
file.close();
}
当QFile时使用此功能,行为打开close()由受控AutoCloseHandle标志。如果指定了AutoCloseHandle,并且此函数成功执行,则调用close()将关闭采用的句柄。否则,close()实际上不会关闭文件,而只会刷新它。
警告:
- 如果FH不引用一个普通的文件,例如,它是
stdin
,stdout
或者stderr
,你可能不能够寻求()。在这些情况下,size()返回0
。有关更多信息,请参见QIODevice :: isSequential()。 - 由于此函数打开文件时未指定文件名,因此您不能将此QFile与QFileInfo一起使用。
Windows平台注意事项
访问文件和其他随机访问设备时,必须以二进制模式打开fh(即,模式字符串必须包含“ b”,如在“ rb”或“ wb”中一样)。如果您将QIODevice :: Text传递给mode,则Qt将转换行尾字符。顺序设备(例如stdin和stdout)不受此限制的影响。
您需要启用对控制台应用程序的支持,以便在控制台上使用stdin,stdout和stderr流。为此,请将以下声明添加到应用程序的项目文件中:
CONFIG += console
另请参见close()。
bool QFile::open(int fd, OpenMode mode, FileHandleFlags handleFlags = DontCloseHandle)
这是一个重载功能。
以给定模式打开现有文件描述符fd。handleFlags可用于指定其他选项。返回成功 否则返回。true
false
当QFile时使用此功能,行为打开关闭()由受控AutoCloseHandle标志。如果指定了AutoCloseHandle,并且此函数成功执行,则调用close()将关闭采用的句柄。否则,close()实际上不会关闭文件,而只会刷新它。
使用此功能打开的QFile会自动设置为原始模式。这意味着文件输入/输出功能很慢。如果遇到性能问题,则应尝试使用其他打开功能之一。
警告:如果fd不是常规文件,例如0(stdin
),1(stdout
)或2(stderr
),则可能无法seek()。在这些情况下,size()返回0
。有关更多信息,请参见QIODevice :: isSequential()。
警告:由于此函数打开文件时未指定文件名,因此您不能将此QFile与QFileInfo一起使用。
另请参见close()。
[override virtual]
QFileDevice :: Permissions QFile :: Permissions()const
重新实现:QFileDevice :: permissions()const。
另请参见setPermissions()。
[static] Permissions QFile::permissions(const QString &fileName)
这是一个重载功能。
返回的完整OR-ED一起组合一个QFile::Permission的文件名。
boolle :: remove()
删除由fileName()指定的文件。返回true
成功 否则返回false
。
在删除文件之前,将其关闭。
另请参见setFileName()。
[static] bool QFile::remove(const QString &fileName)
这是一个重载功能。
删除给定的fileName指定的文件。
返回true
成功 否则返回false
。
另请参见remove()。
bool QFile::rename(const QString &newName)
将当前由fileName()指定的文件重命名为newName。返回true
成功 否则返回false
。
如果名称为newName的文件已经存在,则返回named()false
(即QFile不会覆盖它)。
该文件在重命名之前已关闭。
如果重命名操作失败,Qt将尝试将此文件的内容复制到newName,然后删除此文件,仅保留newName。如果该复制操作失败或无法删除此文件,则将删除目标文件newName以恢复旧状态。
另请参见setFileName()。
[static] bool QFile::rename(const QString &oldName, const QString &newName)
这是一个过载功能。
将文件oldName重命名为newName。返回true
成功 否则返回false
。
如果已经存在名称为newName的文件,则将重命名()返回false
(即QFile将不会覆盖它)。
另请参见rename().
[virtual] bool QFile::resize(qint64 sz)
重新实现:QFileDevice :: resize(qint64 sz)。
[static] bool QFile::resize(const QString &fileName, qint64 sz)
这是一个过载功能。
将fileName设置为sz大小(以字节为单位)。true
如果调整成功,则返回;否则返回false。否则为假。如果sz当前大于fileName,则新字节将被设置为0;如果sz较小,则文件将被截断。
警告:如果文件不存在,此功能可能会失败。
另请参见resize()。
void QFile::setFileName(const QString &name)
设置名称的文件。该名称不能有路径,相对路径或绝对路径。
如果文件已经打开,请勿调用此函数。
如果文件名没有路径或相对路径,则使用的路径将是open()调用时应用程序的当前目录路径。
例:
QFile file;
QDir::setCurrent("/tmp");
file.setFileName("readme.txt");
QDir::setCurrent("/home");
file.open(QIODevice::ReadOnly); // opens "/home/readme.txt" under Unix
请注意,目录分隔符“ /”适用于Qt支持的所有操作系统。
另请参见fileName(),QFileInfo和QDir。
[override virtual]
bool QFile :: setPermissions(QFileDevice :: Permissions 权限)
重新实现:QFileDevice :: setPermissions(QFileDevice :: Permissions权限)。
将文件的权限设置为指定的权限。true
如果成功,或者false
无法修改权限,则返回。
警告:此功能不处理ACL,这可能会限制其有效性。
另请参阅权限()和setFileName()。
[static] bool QFile::setPermissions(const QString &fileName, Permissions permissions)
这是一个过载功能。
将fileName文件的权限设置为Permissions。
[virtual] qint64 QFile::size() const
重新实现:QFileDevice :: size()常量。
[static] QString QFile::symLinkTarget(const QString &fileName)
返回由fileName指定的符号链接(或Windows上的快捷方式)所引用的文件或目录的绝对路径,如果fileName与符号链接不对应,则返回空字符串。
该名称可能不代表现有文件;它只是一个字符串。如果符号链接指向现有文件,则QFile :: exists()返回true
。
此功能在Qt 4.2中引入。
QString QFile::symLinkTarget() const
这是一个过载功能。
返回符号链接(或Windows上的快捷方式)指向的文件或目录的绝对路径,如果对象不是符号链接,则返回空字符串。
该名称可能不代表现有文件;它只是一个字符串。如果符号链接指向现有文件,则QFile :: exists()返回true
。
此功能在Qt 4.2中引入。
另请参见fileName()和setFileName()。