文章目录
- 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的构造函数,我们一起来看一下它有什么构造函数吧。
- QFile::QFile(const QString & name);
原文:Constructs a new file object to represent the file with the given name;
翻译:构造一个新的file对象来表示具有给定名称的文件。- QFile::QFile(QObject * parent);
原文:Constructs a new file object with the given parent
翻译:使用给定的父对象构造一个新的file对象。
用途:指定父对象主要用于来自动回收内存。- 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)