QFile 类【官翻】

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);
    

公共函数

  1. QFile(const QString &name, QObject *parent)

  2. QFile(QObject *parent)

  3. QFile(const QString &name)

  4. QFile()

  5. virtual ~QFile()

  6. bool copy(const QString &newName)

  7. bool exists() const

  8. bool link(const QString &linkName)
    创建一个名为linkName的链接,该链接指向fileName() 当前指定的文件。 什么是链接取决于基础文件系统(在Windows上是快捷方式还是在Unix上是符号链接)。 如果成功,则返回true;否则,返回false。 否则返回false。
    该功能不会覆盖文件系统中已经存在的实体; 在这种情况下,link() 将返回false并将error() 设置为返回RenameError。

    注意:要在Windows上创建有效的链接,linkName必须具有.lnk文件扩展名。

    另请参见setFileName() 。

  9. bool moveToTrash()
    fileName() 指定的文件移动到垃圾箱。 如果成功,则返回true,并将fileName() 设置为可在回收站中找到文件的路径; 否则返回false。

    注意:在系统API不报告垃圾桶中文件位置的系统上,一旦文件移动,fileName() 将设置为空字符串。 在没有垃圾桶的系统上,此函数始终返回false。

  10. bool open(FILE *fh, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)

  11. bool open(int fd, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)

  12. bool remove()

  13. bool rename(const QString &newName)

  14. void setFileName(const QString &name)

  15. QString symLinkTarget() const
    返回由fileName指定的符号链接(或Windows上的快捷方式)所引用的文件或目录的绝对路径,或者如果fileName与符号链接不对应,则返回空字符串。
    该名称可能不代表现有文件; 它只是一个字符串。 如果符号链接指向现有文件,则QFile :: exists() 返回true。

重新实现的公共函数

  1. virtual QString fileName() const override
  2. virtual bool open(QIODevice::OpenMode mode) override
  3. virtual QFileDevice::Permissions permissions() const override
  4. virtual bool resize(qint64 sz) override
  5. virtual bool setPermissions(QFileDevice::Permissions permissions) override
  6. virtual qint64 size() const override

静态公用函数

  1. bool copy(const QString &fileName, const QString &newName)
  2. QString decodeName(const QByteArray &localFileName)
  3. QString decodeName(const char *localFileName)
  4. QByteArray encodeName(const QString &fileName)
  5. bool exists(const QString &fileName)
  6. bool link(const QString &fileName, const QString &linkName)
  7. bool moveToTrash(const QString &fileName, QString *pathInTrash = nullptr)
  8. QFileDevice::Permissions permissions(const QString &fileName)
  9. bool remove(const QString &fileName)
  10. bool rename(const QString &oldName, const QString &newName)
  11. bool resize(const QString &fileName, qint64 sz)
  12. bool setPermissions(const QString &fileName, QFileDevice::Permissions permissions)
  13. QString symLinkTarget(const QString &fileName)
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值