当前位置: 首页 > news >正文

QT-文件

Qt文件系统

Qt 提供了一整套用于文件系统操作的类和工具,它们被设计成跨平台兼容,可以在不同的操作系统上无缝工作。Qt 的文件系统模块主要围绕以下几个核心类和概念:

QIODevice

  • QIODevice 是所有 I/O 设备类的基类,包括文件、缓冲区、网络套接字等。
  • 它定义了基本的读写操作,如 read()write(),以及一些状态管理方法,如 isOpen()open()

QFile

  • QFile 类继承自 QFileDevice,用于处理本地文件系统上的文件。
  • 它提供了高级的文件操作功能,例如打开、关闭、读取、写入、移动、复制和删除文件。
  • QFile 可以与 QTextStreamQDataStream 结合使用,以方便地读写文本和二进制数据。

QFileInfo

  • 用于获取和设置文件和目录的信息,如文件大小、权限、修改时间等。

QDir

  • 用于操作目录,包括列出目录内容、创建、移除目录、改变当前工作目录等。

QTextStream

  • 虽然不是专门的文件系统类,但它提供了读写文本数据的功能,常与 QFile 配合使用。

一、QFile 介绍

QFile 类可以用于打开、读取、写入和关闭文件,以及获取文件信息等操作。

1、QFile常用方法
方法描述
QFile(const QString &name)构造函数,创建一个 QFile 对象并指定文件名。
bool open(QIODevice::OpenMode mode)打开文件,可以指定打开模式,如只读、只写、读写等。
qint64 read(char *data, qint64 maxSize)从文件中读取最多 maxSize 字节的数据到指定的 data 缓冲区中。
qint64 write(const char *data, qint64 maxSize)将数据写入文件,最多写入 maxSize 字节的数据。
bool exists()判断文件是否存在。
qint64 size()返回文件的大小。
bool remove()删除文件。
bool rename(const QString &newName)重命名文件。
bool copy(const QString &newName)复制文件到指定路径。
2、文件打开方式
打开方式描述
QFile::ReadOnly以只读方式打开文件。
QFile::WriteOnly以只写方式打开文件。
QFile::ReadWrite以读写方式打开文件。
QFile::Append以追加方式打开文件。
QFile::Text以文本模式打开文件。
QFile::Truncate如果文件已经存在,则清空文件内容。
QFile::Unbuffered禁用文件缓冲,直接进行物理I/O操作。
QFile::NewOnly如果文件已经存在,则打开失败。
QFile::ExistingOnly如果文件不存在,则打开失败。
3、文件读写

工具栏中有如下功能,通过QFile完成新文件的读写操作:

在这里插入图片描述

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QFileDialog>      // 用于文件打开/保存对话框
#include <QPlainTextEdit>   // 用于文本编辑显示QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECT
public:MainWindow(QWidget *parent = nullptr);  // 构造函数~MainWindow();                          // 析构函数private slots:void on_open_triggered();    // 打开文件槽函数void on_save_triggered();    // 保存文件槽函数void on_replace_triggered(); // 替换文本槽函数private:QString path;          // 当前文件路径Ui::MainWindow *ui;    // UI 指针
};#endif // MAINWINDOW_H

cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QFileDialog>
#include <QDir>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this); // 初始化界面
}MainWindow::~MainWindow()
{delete ui; // 释放界面资源
}// 打开文件槽函数
void MainWindow::on_open_triggered()
{// 弹出文件打开对话框,让用户选择文件path = QFileDialog::getOpenFileName(this, "打开文件", QDir::currentPath());QFile file(path);if (file.open(QFile::ReadWrite)) // 打开文件,可读写{QString text = file.readAll(); // 读取文件内容ui->textEdit->setPlainText(text); // 显示在 QPlainTextEdit 中ui->replace->setEnabled(true);    // 启用“替换”按钮ui->save->setEnabled(true);       // 启用“保存”按钮this->statusBar()->showMessage(path); // 状态栏显示文件路径file.close(); // 关闭文件}else{this->statusBar()->showMessage("文件打开失败"); // 打开失败提示}
}// 保存文件槽函数
void MainWindow::on_save_triggered()
{QFile file(path);if (file.open(QFile::WriteOnly)) // 以写模式打开{QString text = ui->textEdit->toPlainText(); // 获取文本编辑内容file.write(text.toUtf8());                  // 写入文件file.close();                                // 关闭文件this->statusBar()->showMessage("保存成功");   // 状态栏提示}else{this->statusBar()->showMessage("保存失败");   // 打开失败提示}
}// “另存为”槽函数
void MainWindow::on_replace_triggered()
{QString filter = "*.txt;*.png"; // 文件类型过滤器// 弹出保存文件对话框QString savePath = QFileDialog::getSaveFileName(this, "保存文件", path, filter);if (!savePath.isEmpty()) // 用户选择了文件路径{bool result = QFile::copy(path, savePath); // 复制当前文件到新路径if (result){path = savePath; // 更新当前文件路径this->statusBar()->showMessage("另存为:" + path); // 状态栏提示}else{this->statusBar()->showMessage("保存失败"); // 复制失败提示}}
}

filePath 是通过 QFileDialog::getOpenFileName() 函数返回的用户选中的文件的完整路径(绝对路径),它可以指向任何路径的文件,而 QDir::currentPath() 只是文件对话框默认打开的起始目录,两者并不冲突。

二、QFileInfo 类

提供关于文件或目录的详细信息,如文件大小、权限、是否为目录、最后修改时间等。

创建 QFileInfo 对象时可以指定一个文件名使该文件作为当前文件,也可以用函数 setFile()指定一个文件作为当前文件。

常用的两种构造函数定义如下:

QFileInfo("文件路径") //指定文件名QFileInfo() //不指定文件名
1、QFileInfo 常用方法
方法描述
QString fileName()返回去除路径的文件名
QString filePath()返回包含路径的文件名
QString path()返回不含文件名的路径
qint64 size()返回文件大小,单位是字节
bool isDir()判断当前对象是不是一个目录或目录的快捷方式
bool isFile()判断当前对象是不是一个文件或文件的快捷方式
QDateTime birthTime()返回文件创建的时间
QDateTime lastModified()返回文件最后被修改的时间
QString suffix()返回文件的扩展名
2、使用示例

创建QFileInfo对象

QFileInfo fileInfo("path/to/your/file.txt");

或者

QFile file("path/to/your/file.txt");
QFileInfo fileInfo(file);

获取文件信息:

QFileInfo fileInfo(QDir::currentPath() + "\\123.txt");
qDebug() << "文件名:" <<  fileInfo.fileName();
qDebug() << "文件路径:" <<  fileInfo.filePath();
qDebug() << "文件路径:" <<  fileInfo.path();
qDebug() << "文件大小:" <<  fileInfo.size();
qDebug() << "是否是目录:" <<  fileInfo.isDir();
qDebug() << "是否是文件:" <<  fileInfo.isFile();
qDebug() << "文件创建时间:" <<  fileInfo.birthTime();
qDebug() << "文件最后修改时间:" <<  fileInfo.lastModified();
qDebug() << "文件扩展名:" <<  fileInfo.suffix();

三、QDir 类

用于操作目录(文件夹)。可以用来列出目录下的文件和子目录,创建、删除目录,以及检查目录是否存在等。

1、常用方法
方法描述
QString rootPath()返回系统的根目录的路径
QString currentPath()返回当前工作目录的路径
bool mkdir(QString &dirName)在当前目录下创建 dirName 表示的子目录
bool exists()判断当前目录是否存在
bool remove(QString &fileName)删除当前目录下的文件 fileName
2、示例
QDir dir("d:\\test"); // 指定要操作的目录if (dir.exists()) // 判断目录是否存在
{qDebug() << "目录存在"; // 如果存在,输出提示
}
else
{if (dir.mkdir("d:\\test")) // 创建目录{qDebug() << "目录被创建"; // 创建成功提示}else{qDebug() << "目录创建失败"; // 创建失败提示}
}// 获取当前工作目录下的所有文件信息
QDir dir2(QDir::currentPath()); // 当前程序运行目录
QFileInfoList list = dir2.entryInfoList(QDir::Files); // 仅列出文件,不包含子目录foreach (QFileInfo entry, list) { // 遍历文件列表qDebug() << "当前目录下的文件:" << entry.fileName(); // 输出每个文件名
}

四、QTextStream类

QTextStream 是 Qt 中用于处理文本数据流的一个类,方便读写文本数据。

1、构造 QTextStream 对象

可以基于 QFile来创建一个 QTextStream 对象

// 使用 QFile
QFile file("example.txt");
if (file.open(QFile::ReadOnly)) {QTextStream in(&file);
}
2、设置字符编码

QTextStream 默认使用 UTF-8 编码

QTextStream out(stdout);
out.setCodec("UTF-8"); // 设置编码为 UTF-8
3、读取数据

使用 readLine() 读取一行,readAll() 读取所有文本,或者使用 >> 运算符读取特定类型的数据。

QString line = in.readLine();
QString allText = in.readAll();
int number;
in >> number;
4、写入数据

使用 << 运算符将数据写入流中。

out << "Hello, world!" << endl;
out << 12345 << " is a number." << endl;
http://www.dtcms.com/a/394515.html

相关文章:

  • 2001-2022年全国地级市高铁开通数据
  • TenstoRT加速YOLOv11——C++端加速
  • 面试技巧第三篇:嵌入式操作系统基础考点:任务、调度和中断
  • 简单使用Vanna
  • 【面板数据】各省环境保护支出统计数据集(2007-2023年)
  • 无需格式转换!FileOptimizer将文件体积压至极致的软件
  • 【论文速递】2025年第17周(Apr-20-26)(Robotics/Embodied AI/LLM)
  • Spring Framework 入门:传统 XML 配置启动方式详解
  • 构建AI智能体:四十、K-Means++与RAG的融合创新:智能聚类与检索增强生成的深度应用
  • Python 中,判断元素是否存在于列表(list)和判断键是否存在于字典(dict)
  • 如何在 Windows 上恢复已删除/未保存的 PowerPoint 文件 - 4 种快速方法
  • 【含文档+PPT+源码】基于过滤协同算法的城市旅游网站的设计与实现
  • week 2
  • Core Animation基础
  • OpenVLC解析
  • 【AI论文】ScaleCUA:借助跨平台数据扩展开源计算机使用代理(系统/工具)规模
  • NW951NW916美光固态闪存NW926NW927
  • Python 如何优雅处理 100GB 数据集——实战案例
  • 快速学习Python(有其他语言基础)
  • 全网首发! Nvidia Jetson Thor 128GB DK 刷机与测评(六)常用功能测评 pi0、pi0.5 环境部署
  • git环境操作指南
  • 【C语言数据结构】题目解析:第1章课后习题
  • 数字魔方,完成二阶、三阶、四阶、五阶复原提示
  • 电子元器件-二级管终篇:基本原理,元件作用与应用场景、参数/数据手册详解,类型介绍/实战
  • AIGC技术深度解析:生成式AI的革命性突破与产业应用实战
  • 数据结构(C语言篇):(十九)归并排序和非比较排序
  • MySQL 字符串拼接
  • 安全运维-Nginx
  • 【Linux命令从入门到精通系列指南】reboot 命令详解:安全重启与关机的终极控制指南
  • LuaC API开发环境搭建保姆级教程