结尾附赠源码
一、创建文件夹
使用QDir类用来创建文件夹,可以是绝对路径、也可以是相对路径。
例如:绝对路径
QDir("/home/user/Documents")QDir("C:/Documents and Settings")
例如:相对路径
QDir("images/landscape.png")
主要操作如下:
// 声明目录对象
QDir dir(path);
// 判断此目录文件是否存在
if (dir.exists(path)) {return path;
}
二、创建文件
使用QFire类来创建文件。
exists();用来判断文件是否存在。
QFile::WriteOnly|QFile::Text;以只写文本方式创建文件
三、创建文件夹和文件的函数实现
1. 新建项目
2. 在项目的头文件(.h)中加入函数声明,如下
QString createMultipleFolders(const QString path); // 创建文件夹
QString createFile(const QString path,const QString suffix); // 创建.dat文件
3. 在(.cpp)文件中添加以下代码
// 1. 引入头文件
#include <QDateTime>
#include <QFile>
#include <QDir>// 2. 在构造函数中添加代码
QString path = createMultipleFolders("D:\\1\\001");
QString pathFile = createFile(path,".txt");// 3. 创建多级文件夹
QString Widget::createMultipleFolders(const QString path)
{QDir dir(path);if (dir.exists(path)) {return path;}QString parentDir = createMultipleFolders(path.mid(0, path.lastIndexOf('\\')));//截取根目录QString dirName = path.mid(path.lastIndexOf('\\') + 1);//截取父目录QDir parentPath(parentDir);if (!dirName.isEmpty()){parentPath.mkpath(dirName);}return parentDir + "\\" + dirName;
}// 4. 创建文件
QString Widget::createFile(const QString path,const QString suffix)
{QString createTime = QDateTime::currentDateTime().toString("yyyy-MM-dd HH-mm-ss");//文件名不能用“:”命名QString fileName = path + "\\" + createTime + suffix;QFile file(fileName);if(file.exists()){return fileName;}else{// 如果没有此文件,就创建file.open(QFile::WriteOnly|QFile::Text|QIODevice::Append);}return fileName;
}
4. 实现效果
创建成功! 不局限与".dat”文件,其他后缀名的也可以,自己试一下吧!
四、将数据写入文件
1. 使用QFire类;
2. QFile::WriteOnly|QFile::Text|QIODevice::Append;以只写文本方式创建文件,以追加方式写入文件;
3. 调用write()函数将数据写入指定文件中。
4. 实现如下
QFile file(pathFile);//上面操作已经创建出来的文件名
file.open(QIODevice::WriteOnly|QIODevice::Append|QIODevice::Text);
file.write("你好!");
5. 运行后,打开文件,可以看到你写入的数据
五、从文件中读取数据
1. 使用QFire类;
2. QFile::ReadWrite|QFile::Text;以读写方式打开文件;
3. 调用atEnd()函数判断是否读取到最后;
4. 调用readLine();函数一行一行读取数据
5. 读取完后,需要关闭文件。
6. 实现如下
在头文件中添加函数声明
void readFileData(); // 从文件中读取数据
在.cpp文件中实现
/* 从指定文件中读取数据 */
void Widget::readFileData()
{QFile file1("D:/1/001/2022-05-28 11-17-09.txt");// 读写模式打开文件file1.open(QIODevice::ReadWrite | QIODevice::Text);QString data;QStringList user_data;//判断文件是否打开成功if(file1.isOpen()){if(file1.size() != 0)//文件有数据{
// qDebug() << "文件有数据";//一行一行一直读,直至读取失败while(!file1.atEnd()){// readAll();全部取出来data=file1.readLine();//读取一行存到data里
// user_data=data.split(" ");//将data里的数据以空格作为分隔符存到user_data//......// 处理数据qDebug() << data; // 输出结果为:"你好!"}// 读取完后关闭文件file1.close();}}else{qDebug() << "文件打开失败";}
}
7. 运行后,能够获取到数据
至此所有跟文件有关的操作就结束啦。下面附赠源码,可以直接复制可运行。
.pro 文件源码
QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
.h 头文件源码
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();QString createMultipleFolders(const QString path); // 创建文件夹QString createFile(const QString path,const QString suffix); // 创建.dat文件void readFileData(); // 从文件中读取数据private:Ui::Widget *ui;
};
#endif // WIDGET_H
main.cpp源码
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
.cpp源码
#include "widget.h"
#include "ui_widget.h"#include <QDateTime>
#include <QFile>
#include <QDir>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建文件夹和文件QString path = createMultipleFolders("D:\\1\\001");QString pathFile = createFile(path,".txt");// 将数据写入文件中QFile file(pathFile);//上面操作已经创建出来的文件名file.open(QIODevice::WriteOnly|QIODevice::Append|QIODevice::Text);file.write("你好!");// 文件中读取数据readFileData();}Widget::~Widget()
{delete ui;
}
/* 创建多级文件夹 */
QString Widget::createMultipleFolders(const QString path)
{QDir dir(path);if (dir.exists(path)) {return path;}QString parentDir = createMultipleFolders(path.mid(0, path.lastIndexOf('\\')));//截取根目录QString dirName = path.mid(path.lastIndexOf('\\') + 1);//截取父目录QDir parentPath(parentDir);if (!dirName.isEmpty()){parentPath.mkpath(dirName);}return parentDir + "\\" + dirName;
}/* 创建文件 */
QString Widget::createFile(const QString path,const QString suffix)
{QString createTime = QDateTime::currentDateTime().toString("yyyy-MM-dd HH-mm-ss");//文件名不能用“:”命名QString fileName = path + "\\" + createTime + suffix;QFile file(fileName);if(file.exists()){return fileName;}else{// 如果没有此文件,就创建file.open(QFile::WriteOnly|QFile::Text|QIODevice::Append);}return fileName;
}/* 从指定文件中读取数据 */
void Widget::readFileData()
{QFile file1("D:/1/001/2022-05-28 11-17-09.txt");// 读写模式打开文件file1.open(QIODevice::ReadWrite | QIODevice::Text);QString data;QStringList user_data;//判断文件是否打开成功if(file1.isOpen()){if(file1.size() != 0)//文件有数据{
// qDebug() << "文件有数据";//一行一行一直读,直至读取失败while(!file1.atEnd()){// readAll();全部取出来data=file1.readLine();//读取一行存到data里
// user_data=data.split(" ");//将data里的数据以空格作为分隔符存到user_data//......// 处理数据qDebug() << data; // 输出结果为:"你好!"}// 读取完后关闭文件file1.close();}}else{qDebug() << "文件打开失败";}
}
希望大家可以自己多试试。