【QT学习十四】 文件目录操作

目录

一、概述

二、详解

1. QFile

QFile 类中的一些静态方法:

使用示例:

注意事项:

2. QDir

成员函数

使用实例:

注意事项:

3. QFileInfo

成员函数

使用实例

4. QTemporaryFile

成员函数

使用实例

注意事项:

5. QFileSystemModel

实例

6.QCoreApplication

使用实例

7.QFileSystemWatcher

成员函数

信号

使用实例


一、概述

        Qt提供了一些用于文件和目录操作的类,这些类使得在Qt应用程序中进行文件系统操作变得非常方便。以下是一些常用的文件和目录操作相关的类:

  1. QFile:用于执行文件的操作,例如读取、写入、复制和移动文件等。

  2. QDir:提供了对目录的操作,例如列出目录中的文件、创建和删除目录等。

  3. QFileInfo:提供了关于文件和目录的元信息,如文件大小、创建时间、修改时间等。

  4. QTemporaryFile:用于创建临时文件,通常用于临时性的文件操作。

  5. QFileSystemModel:提供了一个模型来展示文件系统的结构,可以在Qt的视图组件中使用,如QTreeView和QListView。

  6. QCoreApplication:获取应用程序的名称、路径、版本和组织名称等信息。

  7. QFileSystemWatcher: 用于监视文件系统中文件和目录变化。

        这些类都是Qt核心模块的一部分,可以在Qt文档中找到详细的使用说明和示例代码。使用这些类,开发者可以轻松地在Qt应用程序中进行文件和目录操作,而不必依赖于操作系统特定的API。

二、详解

        当涉及到文件和目录操作时,Qt提供了一些功能强大且易于使用的类。以下更详细地介绍下每个类的功能,并提供一些具体的实例说明以及注意事项。

1. QFile

QFile 类提供了许多方法来执行文件级别的操作,如读取、写入、复制和移动文件等。

QFile 类中的一些静态方法:

- copy(const QString &fileName, const QString &newName):复制一个文件。fileName 是原始文件名,newName 是新文件名。

- decodeName(const QByteArray &localFileName):将本地文件名解码为 Unicode 编码的文件名。

- decodeName(const char *localFileName):重载版本,接受 char * 类型的本地文件名。

- encodeName(const QString &fileName):将 Unicode 编码的文件名编码为本地文件名。

- exists(const QString &fileName):检查文件是否存在。

- link(const QString &fileName, const QString &linkName):在文件系统中创建一个符号链接。

- moveToTrash(const QString &fileName, QString *pathInTrash = nullptr):将文件移到回收站。可选参数 pathInTrash 用于获取文件在回收站中的路径。

- permissions(const QString &fileName):获取文件的权限。

- remove(const QString &fileName):删除文件。

- rename(const QString &oldName, const QString &newName):重命名文件。

- resize(const QString &fileName, qint64 sz):调整文件大小为 sz 字节。

- setPermissions(const QString &fileName, QFileDevice::Permissions permissions):设置文件的权限。

- symLinkTarget(const QString &fileName):获取符号链接文件的目标路径。

使用示例:

#include <QFile>
#include <QTextStream>
#include <QDebug>

int main() {
    // 创建一个文件对象
    QFile file("D:\\Desktop\\test.txt");

    // 打开文件,以只读模式打开
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "Failed to open file";
        return -1;
    }

    // 创建一个文本流,并读取文件内容
    QTextStream in(&file);
    QString content = in.readAll();

    // 输出文件内容
    qDebug() << "File content:" << content;

    // 关闭文件
    file.close();

    return 0;
}

注意事项:

  • 在打开文件时,一定要检查是否成功打开文件,使用 open() 方法返回的布尔值进行检查。
  • 使用文件之后,一定要记得关闭文件,可以通过 close() 方法来关闭文件。

2. QDir

QDir 类提供了对目录的操作,如列出目录中的文件、创建和删除目录等。

成员函数

QDir 类提供了一系列方法来获取目录的信息、列出目录中的文件和子目录、创建和删除目录等。以下是这些方法的简要说明:

- QString absoluteFilePath(const QString &fileName) const:返回指定文件名的绝对路径。

- QString absolutePath() const:返回目录的绝对路径。

- QString canonicalPath() const:返回规范化的路径,即去除符号链接并且进行路径合并。

- bool cd(const QString &dirName):切换到指定的子目录。

- bool cdUp():切换到父目录。

- uint count() const:返回目录中的条目数(文件和子目录的总数)。

- QString dirName() const:返回目录的名称。

- QFileInfoList entryInfoList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const:返回符合给定名称过滤器、过滤器和排序标志的文件和子目录的信息列表。

- QFileInfoList entryInfoList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const:重载版本,返回所有文件和子目录的信息列表。

- QStringList entryList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const:返回符合给定名称过滤器、过滤器和排序标志的文件和子目录的名称列表。

- QStringList entryList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const:重载版本,返回所有文件和子目录的名称列表。

- bool exists(const QString &name) const:检查给定名称的文件或子目录是否存在。

- bool exists() const:检查当前目录是否存在。

- QString filePath(const QString &fileName) const:返回指定文件名的完整路径。

- QDir::Filters filter() const:返回目录过滤器。

- bool isAbsolute() const:检查目录是否是绝对路径。

- bool isEmpty(QDir::Filters filters = Filters(AllEntries | NoDotAndDotDot)) const:检查目录是否为空。

- bool isReadable() const:检查目录是否可读。

- bool isRelative() const:检查目录是否是相对路径。

- bool isRoot() const:检查目录是否是根目录。

- bool makeAbsolute():将相对路径转换为绝对路径。

- bool mkdir(const QString &dirName) const:创建一个子目录。

- bool mkpath(const QString &dirPath) const:创建一个多级目录。

- QStringList nameFilters() const:返回名称过滤器列表。

- QString path() const:返回目录的路径。

- void refresh() const:刷新目录的内容,以便反映最新的文件和子目录。

- QString relativeFilePath(const QString &fileName) const:返回指定文件名的相对路径。

- bool remove(const QString &fileName):删除指定文件或子目录。

- bool removeRecursively():递归删除目录及其所有内容。

- bool rename(const QString &oldName, const QString &newName):重命名文件或子目录。

- bool rmdir(const QString &dirName) const:删除指定的子目录。

- bool rmpath(const QString &dirPath) const:递归删除指定的目录及其所有内容。

- void setFilter(QDir::Filters filters):设置目录过滤器。

- void setNameFilters(const QStringList &nameFilters):设置名称过滤器列表。

- void setPath(const QString &path):设置目录的路径。

- void setSorting(QDir::SortFlags sort):设置排序标志。

- QDir::SortFlags sorting() const:返回排序标志。

- void swap(QDir &other):交换两个目录对象的内容。

使用实例:

#include <QDir>
#include <QDebug>

int main() {
    // 创建一个目录对象
    QDir dir(".");

    // 列出目录中的文件
    QStringList files = dir.entryList(QDir::Files);
    qDebug() << "Files in the current directory:";
    foreach(const QString &file, files) {
        qDebug() << file;
    }

    // 创建一个新目录
    QDir().mkdir("new_directory");

    // 删除一个目录
    QDir().rmdir("new_directory");

    return 0;
}

注意事项:

  • 使用 entryList() 方法可以列出目录中的文件和子目录。
  • 使用 mkdir() 方法可以创建新目录,使用 rmdir() 方法可以删除目录。

3. QFileInfo

QFileInfo 类提供了关于文件和目录的元信息,如文件大小、创建时间、修改时间等。

成员函数

以下是 QFileInfo 类的一些重要成员函数:

- absoluteDir() const: 返回文件所在目录的绝对路径的 `QDir` 对象。

- absoluteFilePath() const: 返回文件的绝对路径。

- absolutePath() const: 返回文件所在目录的绝对路径。

- baseName() const: 返回文件的基本名称(不包括路径和文件扩展名)。

- birthTime() const: 返回文件的创建时间。

- bundleName() const: 返回文件的 bundle 名称(适用于 macOS)。

- caching() const: 返回是否启用了文件信息缓存。

- canonicalFilePath() const: 返回规范化的文件路径(解析符号链接、路径转义等)。

- canonicalPath() const: 返回文件所在目录的规范化路径。

- completeBaseName() const: 返回文件的完整基本名称(包括路径但不包括文件扩展名)。

- completeSuffix() const: 返回文件的完整后缀名(包括点号)。

- dir() const: 返回文件所在目录的 `QDir` 对象。

- exists() const: 检查文件是否存在。

- fileName() const: 返回文件名(包括路径)。

- filePath() const: 返回文件路径(包括路径)。

- fileTime(QFile::FileTime time) const: 返回文件的指定时间戳(例如最后修改时间、最后访问时间等)。

- group() const: 返回文件所属组。

- groupId() const: 返回文件的组 ID。

- isAbsolute() const: 检查文件路径是否是绝对路径。

- isBundle() const: 检查文件是否是 bundle 文件(适用于 macOS)。

- isDir() const: 检查文件是否是目录。

- isExecutable() const: 检查文件是否可执行。

- isFile() const: 检查文件是否是普通文件。

- isHidden() const: 检查文件是否是隐藏文件。

- isJunction() const: 检查文件是否是 junction(适用于 Windows)。

- isNativePath() const: 检查文件路径是否是本地路径。

- isReadable() const: 检查文件是否可读。

- isRelative() const: 检查文件路径是否是相对路径。

- isRoot() const: 检查文件路径是否是根目录。

- isShortcut() const: 检查文件是否是快捷方式(适用于 Windows)。

- isSymLink() const: 检查文件是否是符号链接。

- isSymbolicLink() const: 重载版本,检查文件是否是符号链接。

- isWritable() const: 检查文件是否可写。

- lastModified() const: 返回文件的最后修改时间。

- lastRead() const: 返回文件的最后访问时间。

使用实例

#include <QFileInfo>
#include <QDebug>
#include <QDateTime>

int main() {
    // 创建一个文件信息对象
    QFileInfo fileInfo("D:\\Desktop\\test.txt");

    // 获取文件路径
    QString filePath = fileInfo.absoluteFilePath();
    qDebug() << "Absolute file path:" << filePath;

    // 获取文件大小
    qint64 fileSize = fileInfo.size();
    qDebug() << "File size:" << fileSize << "bytes";

    // 获取文件创建时间
    QDateTime createdTime = fileInfo.created();
    qDebug() << "File created time:" << createdTime.toString(Qt::ISODate);

    return 0;
}

4. QTemporaryFile

QTemporaryFile 类用于创建临时文件,通常用于临时性的文件操作。

成员函数

- bool autoRemove() const:返回当前是否启用了自动删除标志。如果返回 `true`,则在销毁 `QTemporaryFile` 对象时,相关的临时文件将被自动删除;如果返回 `false`,则需要手动调用 `remove()` 函数来删除临时文件。

- QString fileTemplate() const:返回当前的文件名模板。文件名模板是用于生成临时文件名的字符串模板,默认情况下为系统默认的临时文件名模板。

- bool open():尝试打开临时文件。如果打开成功,则返回 `true`,否则返回 `false`。注意,在调用此函数之前,应该已经设置了文件名模板和自动删除标志,并且需要在打开文件之后才能对文件进行读写操作。

- void setAutoRemove(bool b):设置是否启用自动删除标志。如果参数 `b` 为 `true`,则在销毁 `QTemporaryFile` 对象时会自动删除相关的临时文件;如果参数 `b` 为 `false`,则需要手动调用 `remove()` 函数来删除临时文件。

- void setFileTemplate(const QString &name):设置文件名模板。文件名模板是一个字符串,用于生成临时文件的文件名。可以在模板中使用 `%1` 来表示一个随机的唯一标识符。默认情况下,文件名模板采用系统默认的临时文件名模板。

使用实例

#include <QTemporaryFile>
#include <QDebug>

int main() {
    // 创建临时文件对象
    QTemporaryFile tempFile;

    // 设置自动删除标志
    tempFile.setAutoRemove(true);

    // 打开临时文件
    if (!tempFile.open()) {
        qDebug() << "Failed to open temporary file";
        return -1;
    }

    // 向临时文件写入数据
    tempFile.write("Hello, world!");

    // 关闭临时文件
    tempFile.close();

    // 读取临时文件内容
    if (tempFile.open()) {
        QByteArray data = tempFile.readAll();
        qDebug() << "Temporary file content:" << data;
        tempFile.close();
    } else {
        qDebug() << "Failed to open temporary file for reading";
    }

    return 0;
}

注意事项:

  • 使用 open() 方法打开临时文件时,一定要检查是否成功打开文件。
  • 临时文件对象在作用域结束时会自动删除文件,无需手动删除。

5. QFileSystemModel

QFileSystemModel 类提供了一个模型来展示文件系统的结构,可以在Qt的视图组件中使用,如 QTreeViewQListView

实例

#include <QFileSystemModel>
#include <QTreeView>
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个文件系统模型
    QFileSystemModel model;
    model.setRootPath(QDir::currentPath());

    // 创建一个树视图,并将文件系统模型设置为其模型
    QTreeView treeView;
    treeView.setModel(&model);
    treeView.setRootIndex(model.index(QDir::currentPath()));

    treeView.show();

    return app.exec();
}

6.QCoreApplication

 QCoreApplication 类是Qt中的一个核心类,用于创建Qt应用程序的基本框架。它提供了一些功能,使得应用程序可以处理事件循环、管理应用程序的执行以及进行一些基本的初始化工作。主要用于创建不依赖于图形界面的应用程序,例如控制台应用程序和后台服务。

        可以通过 applicationName()applicationVersion()organizationName() 等方法获取应用程序的名称、版本和组织名称等信息。

使用实例

#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    qDebug() << "Application name:" << app.applicationName();
    qDebug() << "Application version:" << app.applicationVersion();
    qDebug() << "Organization name:" << app.organizationName();

    qDebug() << "Command line arguments:";
    QStringList args = app.arguments();
    foreach(const QString &arg, args) {
        qDebug() << arg;
    }

    // 执行应用程序的事件循环
    return app.exec();
}

7.QFileSystemWatcher

QFileSystemWatcher 类是 Qt 中用于监视文件系统中文件和目录变化的类。它可以监视一个或多个文件或目录,当被监视的文件或目录发生变化时,例如被修改、重命名、删除等操作,QFileSystemWatcher 将会发出相应的信号,通知应用程序

成员函数

- bool addPath(const QString &path):添加要监视的单个文件或目录,并返回是否添加成功。如果成功添加,则返回 true;如果文件或目录已经在监视列表中,则返回 false。

- QStringList addPaths(const QStringList &paths):添加要监视的多个文件或目录,并返回已成功添加到监视列表的文件和目录列表。

- QStringList directories() const:返回当前被监视的目录列表。

- QStringList files() const:返回当前被监视的文件列表。

- bool removePath(const QString &path):从监视列表中移除单个文件或目录,并返回是否移除成功。如果成功移除,则返回 true;如果文件或目录不在监视列表中,则返回 false。

- QStringList removePaths(const QStringList &paths):从监视列表中移除多个文件或目录,并返回已成功移除的文件和目录列表。

信号


- directoryChanged(const QString &path):目录发生变化时发出的信号,参数为发生变化的目录路径。

- fileChanged(const QString &path):文件发生变化时发出的信号,参数为发生变化的文件路径。

使用实例

#include <QCoreApplication>
#include <QFileSystemWatcher>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    QFileSystemWatcher watcher;

    // 添加要监视的文件或目录
    watcher.addPath("D:\\Desktop\\file.txt");
    watcher.addPath("D:\\Desktop");

    // 监听文件变化信号
    QObject::connect(&watcher, &QFileSystemWatcher::fileChanged, [&] (const QString &path) {
        qDebug() << "File" << path << "changed";
    });

    // 监听目录变化信号
    QObject::connect(&watcher, &QFileSystemWatcher::directoryChanged, [&] (const QString &path) {
        qDebug() << "Directory" << path << "changed";
    });

    return a.exec();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/380111.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis(三)主从架构、Redis哨兵架构、Redis集群方案对比、Redis高可用集群搭建、Redis高可用集群之水平扩展

转自 极客时间 Redis主从架构 redis主从架构搭建&#xff0c;配置从节点步骤&#xff1a; 1、复制一份redis.conf文件2、将相关配置修改为如下值&#xff1a; port 6380 pidfile /var/run/redis_6380.pid # 把pid进程号写入pidfile配置的文件 logfile "6380.log" …

C语言每日一题(50)二叉树的最大深度

力扣104 二叉树的最大深度 题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; …

嵌入式学习之Linux入门篇笔记——15,Linux编写第一个自己的命令

配套视频学习链接&#xff1a;http://【【北京迅为】嵌入式学习之Linux入门篇】 https://www.bilibili.com/video/BV1M7411m7wT/?p4&share_sourcecopy_web&vd_sourcea0ef2c4953d33a9260910aaea45eaec8 1.什么是命令&#xff1f; 命令就是可执行程序。 比如 ls -a…

学习Android的第八天

目录 Android ImageView 图像视图 ImageView 的基本使用 src属性和background属性的区别 范例 解决 anndroid:blackground 属性拉伸导致图片变形的方法 设置透明度的问题 范例 android:src 和 android:background 结合 范例 Java 代码中设置 blackground 和 src 属性…

k8s 部署java应用 基于ingress+jar包

k8 集群ingress的访问模式 先部署一个namespace 命名空间 vim namespace.yaml kind: Namespace apiVersion: v1 metadata:name: ingress-testlabels:env: ingress-test 在部署deployment deployment是pod层一层封装。可以实现多节点部署 资源分配 回滚部署等方式。 部署的…

融资项目——获取树形结构的数据

如下图所示&#xff0c;下列数据是一个树形结构数据&#xff0c;行业中包含若干子节点。表的设计如下图&#xff0c;设置了一个id为1的虚拟根节点。&#xff08;本树形结构带虚拟根节点共三层&#xff09; 实现逻辑&#xff1a; 延时展示方法&#xff0c;先展现第二层的信息&a…

C++自定义函数详解

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 铁汁们新年好呀&#xff0c;今天我们来了解自定义函数。 文章目录 1.数学中的函数 2.什么是自定义函数 3.自定义函数如何使用&#xff1f; 4.值传递和引用传递&#xff08;形参和实参区分&#xff09; …

电脑服务器离线安装.net framework 3.5解决方案(错误:0x8024402c )(如何确定当前系统是否安装NET Framework 3.5)

问题环境&#xff1a; 日常服务的搭建或多或少都会有需要到NET Framework 3.5的微软程序运行框架&#xff0c;本次介绍几种不同的安装方式主要解决运行在Windows 2012 以上的操作系统的服务。 NET Framework 3.5 是什么&#xff1f; .NET Framework是微软公司推出的程序运行框架…

【超高效!保护隐私的新方法】针对图像到图像(l2l)生成模型遗忘学习:超高效且不需要重新训练就能从生成模型中移除特定数据

针对图像到图像生成模型遗忘学习&#xff1a;超高效且不需要重新训练就能从生成模型中移除特定数据 提出背景如何在不重训练模型的情况下从I2I生成模型中移除特定数据&#xff1f; 超高效的机器遗忘方法子问题1: 如何在图像到图像&#xff08;I2I&#xff09;生成模型中进行高效…

Nginx与history路由模式:刷新页面404问题

使用nginx部署前端项目&#xff0c;路由模式采用history模式时&#xff0c;刷新页面之后&#xff0c;显示404。 路由模式 前端路由的基本作用为&#xff1a; ①当浏览器地址变化时&#xff0c;切换页面&#xff1b; ②点击浏览器后退、前进按钮时&#xff0c;更新网页内容&…

双面板设计的一套经验规则-笔记

过大的分布电感导致信号地干扰也就是地弹(专业名词) 还有就是输出瞬态电流导致的地弹 图中可以看到最高 0.5V 的信号地干扰&#xff0c;这只是单一块开发板的测试结果。如果接上外围电路&#xff0c;甚至面包板电路可以想象噪声水平可能会更高。 双面电路板 经验规则 下面来…

Tomcat 原理分析

1、Tomcat 的组成 如下图&#xff1a; Tomcat组成 Server&#xff1a; Tomcat 封装的、对外提供完整的、基于组件的 web 服务&#xff0c;包含 Connectors、Container 两个核心组件&#xff0c;以及多个功能组件&#xff0c;各个 Service 之间是独立的&#xff0c;但是共享 同…

【数据结构】前缀树的模拟实现

目录 1、什么是前缀树&#xff1f; 2、模拟实现 2.1、前缀树节点结构 2.2、字符串的添加 2.3、字符串的查寻 2.3.1、查询树中有多少个以字符串"pre"作为前缀的字符串 2.3.2、查询某个字符串被添加过多少次 2.4、字符串的删除 3、完整代码 1、什么是前缀树&…

Flink 2.0 状态存算分离改造实践

本文整理自阿里云智能 Flink 存储引擎团队兰兆千在 FFA 2023 核心技术&#xff08;一&#xff09;中 的分享&#xff0c;内容关于 Flink 2.0 状态存算分离改造实践的研究&#xff0c;主要分为以下四部分&#xff1a; Flink 大状态管理痛点 阿里云自研状态存储后端 Gemini 的存…

Linux下的crontab定时执行任务命令详解

在LINUX中&#xff0c;周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron]。cron读取一个或多个配置文件&#xff0c;这些配置文件中包含了命令行及其调用时间。 cron的配置文件称为“crontab”&#xff0c;是“cron table”的简写。 一、cron服务   cron是一个…

为什么要进行FTP替代?专业的FTP替代方案了解一下!

FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;的历史可以追溯到20世纪70年代&#xff0c;这是一个由美国国防部资助的早期计算机网络&#xff0c;后来发展成为互联网的前身。随着时间的推移&#xff0c;FTP经历了多次迭代和改进&#xff0c;以适…

有关网络安全的课程学习网页

1.思科网络学院 免费学习skillsforall的课程 课程链接&#xff1a;Introduction to Cybersecurity by Cisco: Free Online Course (skillsforall.com) 2.斯坦福大学计算机和网络安全基础 该证书对于初学者来说最有价值&#xff0c;它由最著名的大学之一斯坦福大学提供。您可…

【动态规划】【C++算法】2518. 好分区的数目

作者推荐 【动态规划】【前缀和】【C算法】LCP 57. 打地鼠 本文涉及知识点 动态规划汇总 LeetCode:2518. 好分区的数目 给你一个正整数数组 nums 和一个整数 k 。 分区 的定义是&#xff1a;将数组划分成两个有序的 组 &#xff0c;并满足每个元素 恰好 存在于 某一个 组中…

AVR 328pb ADC基本介绍和使用

AVR 328pb ADC基本介绍和使用 &#x1f4cd;结合参考同架构lgt8f328p中文文档&#xff1a;http://www.prodesign.com.cn/wp-content/uploads/2023/03/LGT8FX8P_databook_v1.0.4.pdf &#x1f4d8;328pb ADC特性 • 10-bit Resolution 10位分辨率 • 0.5 LSB Integral Non-lin…

猫头虎分享已解决Bug || JavaScript语法错误(Syntax Error):SyntaxError: Unexpected token

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …
最新文章