文章目录

  • 1.创建QFile对象
  • 2.open():指定打开方式
  • 3.读文件(Read)
  • 一些类型转换
  • 使用完必须关闭流哦!
  • 读文件例子
  • 4.写文件(Write)
  • 写文件例子
  • 一、QFile的公有成员函数
  • copy() :拷贝文件
  • exists() :判断文件存不存在
  • remove() :删除文件
  • rename() :重命名文件
  • setFileName() :设置文件名称
  • link() :创建快捷方式
  • symLinkTarget() :获取快捷方式路径字符串
  • 二、QFile重写的虚函数
  • fileName() :返回文件名称
  • permissions() :返回文件权限
  • resize() :改变文件大小
  • setPermissions() :设置文件权限
  • size() :返回文件大小
  • pos() :返回文件当前文件指针位置
  • seek() :移动当前文件指针位置

//头文件
#include <QFile>
 //文件对话框
#include <QFileDialog>


1.创建QFile对象

我们在创建QFile对象的时候会用到,QFile的构造函数,我们一起来看一下它有什么构造函数吧。

  1. QFile::QFile(const QString & name);
    原文:Constructs a new file object to represent the file with the given name;
    翻译:构造一个新的file对象来表示具有给定名称的文件。
  2. QFile::QFile(QObject * parent);
    原文:Constructs a new file object with the given parent
    翻译:使用给定的父对象构造一个新的file对象。
    用途:指定父对象主要用于来自动回收内存。
  3. QFile::QFile(const QString & name, QObject * parent);
    原文:Constructs a new file object with the given parent to represent the file with the specified name
    翻译:使用给定的父对象构造一个新的file对象,以表示具有指定名称的文件。

2.open():指定打开方式

当创建完QFile对象后呢,我们就要指定它的打开方式。

bool IsOpen = file.open(OpenMode mode);

该open函数是继承于QIODevice,当然QFile也有重载的两个open函数,由于目前不太懂不进行解析。
有什么打开方式呢?QIODevice::OpenMode:

打开方式

说明

QIODevice::NotOpen

设备未打开


QIODevice::ReadOnly

设备已打开供阅读

QIODevice::WriteOnly

设备已打开可供写入。注意,这个模式意味着截断

QIODevice::ReadWrite

该设备可供阅读和书写

QIODevice::Append

设备以追加模式打开,以便将所有数据写入文件末尾

QIODevice::Truncate

如果可能的话,设备在打开之前会被截断。设备的所有早期内容都已丢失

QIODevice::Text

读取时,行尾终止符将转换为’\n’。写入时,行尾终止符将转换为本地编码,例如,对于win32

QIODevice::Unbuffered

设备中的任何缓冲区都被绕过

QFile可以和QTextStream或QDataStream一起使用,当在打开方式时没有特定指定,那么默认为QDataStream打开

由于open方法返回的是bool值,在这里可以判断有没有打开成功。

3.读文件(Read)

当打开方式指定可以读文件的时候
从QIODevice继承下来的读文件公有方法:

qint64 read(char * data, qint64 maxSize)

以二进制的方式进行读取;将设备中maxSize字节读入数据保存在data中,并返回读取的字节数;当没有更多数据可供读取时,返回0;读过流的末尾为错误,返回-1 。

QByteArray read(qint64 maxSize)

从设备中读取maxSize字节,并将读取的数据作为QByteArray(字节数组)返回。

QByteArray readAll()

从设备读取所有可用数据,并将其作为QByteArray返回。

qint64 readLine(char * data, qint64 maxSize)

从设备中读取一行ASCII字符(最大为maxSize - 1字节),将字符存储在data中,并返回读取的字节数。如果一行不能被读取,但是没有错误发生,这个函数返回0。如果发生错误,将返回可读内容的长度,如果未读,则返回-1,结束的“\0”字节总是附加到数据中,因此maxSize必须大于1。

QByteArray readLine(qint64 maxSize = 0)

从设备中读取一行,但不超过maxSize字符,并以字节数组的形式返回结果。

一些类型转换

QString 转 QByteArray :

QString.toUtf8();

QByteArray 转 QString :

QString(QByteArray);

QByteArray 转 std::string :

QByteArray.toStdString();

std::string 转 char * :

string.data();

使用完必须关闭流哦!

QFile对象.close();

读文件例子

//创建一个QFileDialog来获取文件路径
    QString path = QFileDialog::getOpenFileName(
                this,
                "OpenFile",
                "../",
                "TXT file(*.txt)");

    //创建一个QFile对象
    QFile file(path);

    //打开文件,以只读的方式打开文件
    bool isOpen = file.open(QIODevice::ReadOnly|QIODevice::Text);
    
    if(isOpen != false)
    {
    	//QByteArray	readAll()
        QByteArray fileData;
        fileData = file.readAll();
        //显示到textEdit中
        ui->textEdit->setText(QString(fileData));
    }
    else
    {
        qDebug() << "无法打开文件";
    }
    //关闭文件
    file.close();

使用 qint64 read(char * data, qint64 maxSize) 读取数据

if(isOpen != false)
	{
		char* buf = new char[50];
		qint64 IsRead = file.read(buf,49);
		if(IsRead != -1)
		{
		    ui->textEdit->setText(QString(buf));
		}
	}

使用 QByteArray read(qint64 maxSize) 读取数据

if(isOpen != false)
	{
		QByteArray fileData;
		fileData = file.read(49);
		ui->textEdit->setText(QString(fileData));
	}

使用 qint64 readLine(char * data, qint64 maxSize) 读取数据,readAll()已经用过了哦!

if(isOpen != false)
	{
		//atEnd() :当到了文件结尾为true,反则false
		while(!file.atEnd())
		{
			char* buf = new char[50];
			qint64 IsRead = file.readLine(buf,30);
			if(IsRead != -1)
			{
			  	ui->textEdit->append(QString(buf));
			}
		}
	}

使用 QByteArray readLine(qint64 maxSize = 0) 读取数据

if(isOpen != false)
	{
		//atEnd() :当到了文件结尾为true,反则false
		while(!file.atEnd())
		{
			QByteArray fileData;
			fileData = file.readLine();
			ui->textEdit->append(QString(fileData ));
		}
	}

4.写文件(Write)

从QIODevice继承下来的写文件公有方法:

qint64 write(const char * data, qint64 maxSize)

将data提取maxSize字节数写到设备中(由于字体编码问题,中文字符为3个字节)。返回实际写入的字节数,如果发生错误则返回-1。

qint64 write(const char * data)

将以零结尾的8-bit字符串中的数据写入设备。返回实际写入的字节数,如果发生错误则返回-1。这等价于 QIODevice::write(data, qstrlen(data));

qint64 write(const QByteArray & byteArray)

将byteArray的内容写入设备。返回实际写入的字节数,如果发生错误则返回-1

写文件例子

qint64 write(const char * data, qint64 maxSize) 的写法

//创建一个QFileDialog来获取保存文件路径
 	QString path = QFileDialog::getSaveFileName(
                this,
                "SaveFile",
                "../",
                "TXT file(*.txt)");

    //创建一个QFile对象
    QFile file(path);
    //exists() :当该文件存在返回true,反则false
    if(file.exists() == false)
    {
        qDebug() << "没有该文件";
        return;
    }
    //打开文件,以只写的方式打开文件 
    bool isOpen = file.open(QIODevice::WriteOnly);
    if(isOpen == true)
    {
        //获取textEdit内容
        QString text = ui->textEdit->toPlainText();
        //转为标准的库string
        std::string str = text.toStdString();
        //库string转为char*
        //const char * ch = str.c_str();
        const char * one = str.data();
        //英文占一个字节,中文占3个字节
        qint64 isSaveOK = file.write(one,6);
        if(isSaveOK != -1)
        {
          qDebug() << "保存成功";
        }
    }
    else
    {
        qDebug() << "该文件无法打开";
        return;
    }

    file.close();
}

qint64 write(const char * data) 的写法

if(isOpen == true)
    {
        //获取textEdit内容
        QString text = ui->textEdit->toPlainText();
        //转为标准的库string
        std::string str = text.toStdString();
        //库string转为char*
        //const char * ch = str.c_str();
        const char * one = str.data();
        //英文占一个字节,中文占3个字节
        qint64 isSaveOK = file.write(one);
        if(isSaveOK != -1)
        {
          qDebug() << "保存成功";
        }
    }
    else
    {
        qDebug() << "该文件无法打开";
        return;
    }

qint64 write(const QByteArray & byteArray) 的写法

if(isOpen == true)
    {
        //获取textEdit内容
        QString text = ui->textEdit->toPlainText();
        //转为QByteArray 
        QByteArray Bytetxt = text.toUtf8();
        //英文占一个字节,中文占3个字节
        qint64 isSaveOK = file.write(Bytetxt);
        if(isSaveOK != -1)
        {
          qDebug() << "保存成功";
        }
    }
    else
    {
        qDebug() << "该文件无法打开";
        return;
    }

一、QFile的公有成员函数

QFile除了构造函数外还有一些其它的公有成员函数哦!

copy() :拷贝文件

bool QFile::copy(const QString & newName)
静态
 bool QFile::copy(const QString & fileName, const QString & newName)

copy函数说明:
1.将当前指定的文件复制到名为newName的文件中。
2.如果成功返回true;否则返回false。
3.注意,如果一个名为newName的文件已经存在,copy()返回false(即QFile不会覆盖它)。
4.源文件在复制之前关闭
例子:

bool QFile::copy(const QString & newName) 的写法

//创建一个QFileDialog来获取文件路径
    QString path = QFileDialog::getOpenFileName(
                this,
                "OpenFile",
                "../",
                "TXT file(*.txt)");

    //创建一个QFile对象
    QFile file(path);
    if(file.exists())
    {
        //创建一个QFileDialog来获取保存文件路径
        QString SavePath = QFileDialog::getSaveFileName(
                    this,
                    "SaveFile",
                    "../复制的文本",
                    "TXT(*.txt)");

        bool isSaveOK = file.copy(SavePath);
        if(isSaveOK)
        {
            ui->textEdit->setText("文件复制保存成功");
        }
        else
        {
            ui->textEdit->setText("文件复制保存失败");
        }

    }
    else
    {
        ui->textEdit->setText("文件不存在");
        return;
    }

bool QFile::copy(const QString & fileName, const QString & newName) 的写法

//创建一个QFileDialog来获取文件路径
    QString path = QFileDialog::getOpenFileName(
                this,
                "OpenFile",
                "../",
                "TXT file(*.txt)");
                
	//创建一个QFileDialog来获取保存文件路径
    QString SavePath = QFileDialog::getSaveFileName(
                this,
                "SaveFile",
                "../复制的文本",
                "TXT(*.txt)");
    if(QFile::copy(path,SavePath))
    {
        ui->textEdit->setText("文件复制保存成功");
    }
    else
    {
        ui->textEdit->setText("文件复制保存失败");
    }

exists() :判断文件存不存在

bool QFile::exists() const

静态
bool QFile::exists(const QString & fileName)

exists()函数说明:
1.如果fileName文件存在,则返回true;否则返回false。

bool QFile::exists() const 的使用

//创建一个QFileDialog来获取文件路径
    QString path = QFileDialog::getOpenFileName(
                this,
                "OpenFile",
                "../",
                "TXT file(*.txt)");

    //创建一个QFile对象
    QFile file(path);
    //QFile.exists() 文件存在返回true,反之false
    if(file.exists())
    {
        
    }
    else
    {
        ui->textEdit->setText("文件不存在");
        return;
    }

bool QFile::exists(const QString & fileName) 的使用

QString path = QFileDialog::getOpenFileName(
                this,
                "OpenFile",
                "../",
                "TXT file(*.txt)");
 bool IsTrue = QFile::exists(path);
 if(IsTrue)
 {
 	//ok
 }
 else
 {
 	//no
 }

remove() :删除文件

bool QFile::remove()

静态
bool QFile::remove(const QString & fileName)

remove说明:
1.删除filename()指定的文件。如果成功,则返回true;否则返回false。
2.文件在删除前已关闭

用法都跟上方的差不多就不做例子了,第一个需要一个QFlie对象点出来,第二个你只需要文件名就行。

rename() :重命名文件

bool QFile::rename(const QString & newName)

静态
bool QFile::rename(const QString & oldName, const QString & newName)

rename说明:
1.将当前由fileName()指定的文件重命名为newName。如果成功返回true;否则返回false。
2.如果一个名为newName的文件已经存在,rename()返回false(即, QFile不会覆盖它)。
3.在重命名之前关闭文件。
4.如果重命名操作失败,Qt将尝试将该文件的内容复制到newName,然后删除该文件,只保留newName。
5.如果复制操作失败或无法删除此文件,则删除目标文件newName以恢复旧状态

setFileName() :设置文件名称

void QFile::setFileName(const QString & name)

setFileName说明:
1.设置文件的名称。
2.名称可以没有路径、相对路径或绝对路径。
3.如果文件已经被打开,不要调用这个函数。
4.如果文件名没有路径或相对路径,则使用的路径将是open()调用时应用程序的当前目录路径。
5.注意,目录分隔符“/”适用于Qt支持的所有操作系统。

link() :创建快捷方式

bool QFile::link(const QString & linkName)

静态
bool QFile::link(const QString & fileName, const QString & linkName)

link说明:
1.创建一个名为linkName的链接,该链接指向当前由fileName()指定的文件。
2.链接是什么取决于底层文件系统(可能是Windows上的快捷方式,也可能是Unix上的符号链接)。如果成功返回true;否则返回false。
3.此函数不会覆盖文件系统中已存在的实体;在这种情况下,link()将返回false,并将error()设置为返回RenameError。
4.注意:要在Windows上创建有效的链接,linkName必须有一个.lnk文件扩展名

symLinkTarget() :获取快捷方式路径字符串

静态
QString QFile::symLinkTarget(const QString & fileName)

QString QFile::symLinkTarget() const

symLinkTarget说明:
1.返回文件名指定的符号链接(或Windows上的快捷方式)所引用的文件或目录的绝对路径,如果文件名不对应于符号链接,则返回空字符串。
2.此名称可能不表示现有文件;它只是一个字符串。
3.如果符号链接指向一个现有文件,则QFile::exists()返回true。

二、QFile重写的虚函数

fileName() :返回文件名称

QString QFile::fileName() const

fileName说明:
1.重新实现从QFileDevice::fileName()。
2.返回由setFileName()或QFile构造函数设置的名称。

permissions() :返回文件权限

Permissions QFile::permissions() const

静态重载
Permissions QFile::permissions(const QString & fileName)
返回QFile:: fileName的完整OR-ed组合

我对这个也迷迷糊糊的。

resize() :改变文件大小

bool QFile::resize(qint64 sz)

静态重载
bool QFile::resize(const QString & fileName, qint64 sz)
将文件名设置为大小(以字节为单位)sz。如果文件的大小调整成功,则返回true;否则错误。如果sz大于文件名当前是新的字节将被设置为0,如果sz更小的文件只是被截断。

我对这个也迷迷糊糊的。

setPermissions() :设置文件权限

bool QFile::setPermissions(Permissions permissions)

静态重载
bool QFile::setPermissions(const QString & fileName, Permissions permissions)

setPermissions说明:
1.将文件的权限设置为指定的权限。如果成功,则返回true;
2.如果无法修改权限,则返回false。
3.警告:此函数不操作ACLs,这可能会限制其有效性

size() :返回文件大小

qint64 QFile::size() const

size说明:
1.对于开放随机访问设备,此函数返回设备的大小。
2.对于打开的顺序设备,将返回bytesAvailable()。
3.如果设备关闭,返回的大小将不反映设备的实际大小。

pos() :返回文件当前文件指针位置

qint64 QFileDevice::pos() const

seek() :移动当前文件指针位置

bool QFileDevice::seek(qint64 pos)