QFile类用于文件操作,对文件进行读写操作,可读写文件,二进制文件和qt资源文件.处理文本文件和二进制文件可使用QTextStream类和QDataStream类,处理临时文件可以使用QTemporary,获取文件信息可以使用QFileInfo,处理目录可以使用QDir,监视文件和目录变化可以使用QFileSystemWatcher.
1.
QFile读取文件.
QIODevice::ReadOnly表示只读方式打开文件.readLine表示读取一行的字符串.失败返回-1,成功返回读取到的字节长度.
//读取文件
QFile file("hello.txt"); //文件相对路径
if(file.open(QIODevice::ReadOnly)){ //文件打开方式,只读
char buffer[100];
qint32 n;//本质是int类型,32位,4个字节.一个字节8个位
//readLine()返回-1表示失败,成功则返回读取到的字节长度.
//参数:readLine读取的数据保存位置,指定读的数据字节长度.
n = file.readLine(buffer,sizeof(buffer));
if(n != -1){
qDebug()<<"长度:"<<n<<"内容:"<<buffer<<endl;
file.close();
}
}else{
qDebug()<<file.errorString();//打印文件打开失败原因
}
2.
QFile写入文件.QTextStream操作文本文件
QFile::WriteOnly表示以写入文件方式打开文件,QFile::Truncate表示打开文件时对文件数据进行覆盖.
使用文件操作流QTextStream操作文本文件并对设置文件格式,其中setRealNumberPrecision(3)设置整数精度位数为3(即从左往右数有效数字为3个),setFieldWidth(10)设置字段宽度为10.
setFieldAlignment()函数用于设置对齐方式,它的枚举值有4个:
AlignLeft | 左对齐 |
AlignRight | 右对齐 |
AlignCenter | 居中对齐 |
AlignAccountingStyle | 左右两端对齐 |
//写入文件
double dPI = 3.1415926;
int age =13;
QFile dataFile;//QFile dataFile("data.txt");
dataFile.setFileName("data.txt");//初始化/指定文件路径
//与上面使用QIODevice不同的原因是:QFile继承自QIODevice
if(dataFile.open(QFile::WriteOnly | QFile::Truncate)){//Truncate对文件数据进行覆盖
qDebug()<<"文件打开成功"<<endl;
QTextStream out(&dataFile); //文件操作流
out.setRealNumberPrecision(3); //设置整数精度位数.效果同下
out.setFieldWidth(10); //设置字段宽度
out.setFieldAlignment(QTextStream::AlignRight); //设置对齐方式.右对齐
out<<QString("PI:")<<qSetRealNumberPrecision(8) //设置整数精度位数
//<<qSetFieldWidth(10) //设置字段宽度
//<<left //左对齐.
//<<dPI; //整数的精度位数,默认为6位
//<<bin //设置读写整数为二进制
//<<hex //设置读写整数为十六进制
//<<showbase //显示进制前缀
//<<uppercasebase //显示进制前缀大写
<<scientific //科学计数法
<<dPI
<<age;
}
3.
QTextStream流的操作符(可参考上面的代码)
操作符 | 作用描述 | |
bin | 设置读写的整数为 二进制数 | |
oct | 设置读写的整数为 八进制数 | |
dec | 设置读写的整数为十进制数 |
hex | 设置读写的整数为十六进制数 | |
showbase | 强制显示进制前缀,如十六进制(0x)、八进制(0)、二进制(0b) | |
forcesign | 强制显示符号(+、-) | |
forcepoint | 强制显示小数点 | |
noshowbase | 强制不显示前缀 | |
noforcesign | 强制不显示符号 | |
uppercasebase | 显示大写的进制前缀 | |
lowercasebase | 显示小些的进制前缀 | |
uppercasedigits | 用大写字母表示 | |
lowercasedigits | 用小写字母表示 | |
fixed | 固定小数点表示 | |
scientific | 科学计数法表示 | |
left | 左对齐 | |
right | 右对齐 | |
center | 居中 | |
endl | 换行 | |
flush | 清除缓冲 |
4.
QFileInfo类,可以获取文件信息.
包括文件大小size(),
文件创建时间created(),
文件最后一次修改时间lastModified(),
文件最后一次访问时间lastRead();
是否为目录isDir(),
是否为文件isFile(),
是否为连接isSymLink(),
是否隐藏文件isHidden()等等有非常多的关于文件信息的函数.
示例界面.
代码:
使用QFileDialog::getOpenFileName()就可以打开一个模态文件对话框,对文件进行选择.选中文件,则返回一个文件名目录.
QFileDialog::getExistingDirectory()打开一个模态文件对话框,选中文件并返回一个文件目录.
//跳出文件对话框...按钮
void FileInfo::on_browseFileButton_clicked(){
//弹出文件对话框.
//fileName保存的是文件路径.获取打开的文件名,不太好测试目录
//QString fileName = QFileDialog::getOpenFileName(this, //指定父窗体,当前窗体对象作为父窗体
// "打开文件", //对话框标题
// ".", //文件打开路径(相对路径,当前路径作为默认路径)
// "files(*)" //对文件进行过滤条件.所有文件
// );
//把文件名刷新出来
//ui->fileNameLineEdit->setText(fileName);
//getFileInfo(fileName);
//只显示目录不显示文件
QString path = QFileDialog::getExistingDirectory(this,
"选择目录",
".");
ui->fileNameLineEdit->setText(path);
getFileInfo(path);
}
//获取文件信息
void FileInfo::getFileInfo(QString &fileName){
//获取文件信息类(qt内部类)
QFileInfo info(fileName);//文件路径
qint64 size = info.size(); //返回文件大小
QDateTime createTime = info.created(); //返回文件创建日期
QDateTime lastMTime = info.lastModified(); //返回最后一次修改时间
QDateTime lastRTime = info.lastRead(); //返回最后一次访问时间
//文件的属性信息7个
bool bIsDir = info.isDir(); //是否为目录
bool bIsFile = info.isFile(); //是否为文件
bool bIsSymLink = info.isSymLink(); //文件是否为链接
bool bIsHidden = info.isHidden(); //是否隐藏
bool bIsReadable = info.isReadable(); //是否可读
bool bIsWritable = info.isWritable(); //是否可写
bool bIsExcutable = info.isExecutable();//是否为可执行文件
//更新输入框
ui->fileSizeLineEdit->setText(QString::number(size));//整数转为字符串
ui->fileCreateLineEdit->setText(createTime.toString());//toString()日期转字符串
ui->fileModifyLineEdit->setText(lastMTime.toString());
ui->fileReadLineEdit->setText(lastRTime.toString());
//多选按钮7个
ui->isDirCheckBox->setChecked(bIsDir); //判断设置是否勾选
ui->isFileCheckBox->setChecked(bIsFile);
ui->isSymLinkCheckBox->setChecked(bIsSymLink);
ui->isHiddenCheckBox->setChecked(bIsHidden);
ui->isWritableCheckBox->setChecked(bIsWritable);
ui->isReadableCheckBox->setChecked(bIsReadable);
ui->isExecutableCheckBox->setChecked(bIsExcutable);
}
all~~