QFile

简介

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

用法

bool QFile::exists (const QString & fileName) [static]
判断指定文件是否存在。如果给定fileName名的文件存在则返回TRUE,否则返回FALSE。

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

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())
{
      //ok  
}
else
{
    ui->textEdit->setText("文件不存在");
    return;
}

bool QFile::remove(const QString & fileName)
删除filename指定的文件。如果成功,则返回true;否则返回false。文件在删除前已关闭。

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

bool QFile::remove()
删除文件。

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

//创建一个QFile对象
QFile file(path);
//QFile.remove() 文件删除返回true,反之false
if(file.remove())
{
      //ok  
}
else
{
    ui->textEdit->setText("文件删除失败");
    return;
}

QFile::QFile(const QString & name) QFile::QFile(QObject * parent)
QFile::QFile(const QString & name, QObject * parent)
通过指定父类或文件路径构造文件对象。

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

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

bool QFile::open(OpenMode mode)
打开文件。由于open方法返回的是bool值,在这里可以判断有没有打开成功。
在这里插入图片描述

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

//创建一个QFile对象
QFile file(path);
//打开文件,以只读的方式打开文件
bool isOpen = file.open(QIODevice::ReadOnly|QIODevice::Text);

bool QFile::open(FILE * fh, OpenMode mode)
以给定模式打开现有文件指定fh。如果成功则返回true;否则返回false。

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

当QFile使用这个功能打开一个文件时,close()实质上不能关闭文件,而是刷新它。

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

//创建一个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("文件复制保存失败");
}

bool QFile::copy(const QString & newName)
必须先创建一个file对象,再复制。

//创建一个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;
}

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

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

//创建一个QFile对象
QFile file(path);
QByteArray resourceData = file.readAll();

QByteArray QIODevice::readLine(qint64 maxSize = 0)
从设备中读取一行,包含换行符。

QFile file("C:\\Users\\admin\\Desktop\\test.txt");
file.readLine();

void QFile::close()
关闭一个打开的文件。

file.close();

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

//创建一个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 QIODevice::write (const char * data)
将以零结尾的8-bit字符串中的数据写入设备。返回实际写入的字节数,如果发生错误则返回-1。这等价于 QIODevice::write(data, qstrlen(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 QIODevice::write(const QByteArray & byteArray)
将byteArray的内容写入设备。返回实际写入的字节数,如果发生错误则返回-1。

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

bool QFile::flush()
将存放在缓冲区中的文件刷新输出到磁盘上。

file.flush();

注:close()也会将文件写入磁盘,并清除文件缓冲区。

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

QFile file;
QDir::setCurrent("/tmp");
file.setFileName("readme.txt");
QDir::setCurrent("/home");
file.open(QIODevice::ReadOnly);      // opens "/home/readme.txt" 

FileError QFile::error () const
返回文件错误状态。
I/O设备状态返回错误代码。例如,如果open()返回false,或者读/写操作返回-1,则可以调用此函数来找出操作失败的原因。
在这里插入图片描述

if(file.error() != QFile::NoError)
{
	qDebug() << "Error: Cannot write file " << m_xmlFileName
		<< ": " << file.errorString();
	return false;
}

QString QIODevice::errorString () const
返回上次发生的设备错误的可读描述。

qDebug() << "Error: Cannot write file " << m_xmlFileName << ": " << file.errorString();

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

QString strAbsPath = "/home/test.txt";
QString SavePath = "/home/test1.txt";

if(QFile::rename(strAbsPath,SavePath))
{
    ui->textEdit->setText("文件重命名保存成功");
}
else
{
    ui->textEdit->setText("文件重命名保存失败");
}

bool QFile::rename(const QString & newName)
必须先创建一个file对象,再重命名。

QString strAbsPath = "/home/test.txt";
QFile file("strAbsPath ");
file.rename("/home/test1.txt");

bool QFile::atEnd() const
如果已经到达文件末尾则返回TRUE,否则返回FALSE。

QFile file("C:\\Users\\admin\\Desktop\\test.txt");
if(!file.open(QIODevice::ReadOnly))//以读的方式打开文件
    qDebug()<<file.errorString();
 
while(file.atEnd() == false)//文件没到末尾就执行循环体内容
{
    QByteArray buf = file.readLine();//读取一行的数据
    qDebug()<<buf;
}
 
file.close();//关闭文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光开朗男孩

你的鼓励是我最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值