简介
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();//关闭文件