C++17中头文件filesystem的使用
C++17引入了std::filesystem库(文件系统库, filesystem library),相关类及函数的声明在头文件filesystem中,命名空间为std::filesystem。
1.path类:文件路径相关操作,如指定的路径是否存在等,其介绍参见:https://blog.csdn.net/fengbingchun/article/details/133217504
2.directory_entry类:获取文件属性等,如指定文件是否是常规文件,还包括文件大小、文件最后修改时间,其介绍参见:https://blog.csdn.net/fengbingchun/article/details/133430293
3.directory_iterator类:遍历目录,获取目录文件,不包括子目录,其介绍参见:https://blog.csdn.net/fengbingchun/article/details/133437356
4.recursive_directory_iterator类:遍历目录,获取目录文件,包括子目录,其介绍参见:https://blog.csdn.net/fengbingchun/article/details/133437356
5.filesystem_error类:异常类,继承自std::system_error,继承关系如下图所示:

(1).path1, path2:返回存储在异常对象中的path;
(2).what: 返回解释性字符串;
(3).code: 返回错误码。
测试代码如下所示:
int test_filesystem_filesystem_error()
{// path1, path2, whtat// creates a unique filename that does not name a currently existing fileconst fs::path oldp{ std::tmpnam(nullptr) }, newp{ std::tmpnam(nullptr) };/* windows:what(): rename: 系统找不到指定的文件。: "C:\Users\f06190\AppData\Local\Temp\sf2w.0", "C:\Users\f06190\AppData\Local\Temp\sf2w.1"path1(): "C:\\Users\\f06190\\AppData\\Local\\Temp\\sf2w.0"path2(): "C:\\Users\\f06190\\AppData\\Local\\Temp\\sf2w.1" *//* linuxwhat(): filesystem error: cannot rename: No such file or directory [/tmp/filezJrUkO] [/tmp/filey7tqKV]path1(): "/tmp/filezJrUkO"path2(): "/tmp/filey7tqKV" */try {fs::rename(oldp, newp); // throws since oldp does not exist} catch (fs::filesystem_error const& ex) {std::cout << "what(): " << ex.what() << '\n'<< "path1(): " << ex.path1() << '\n'<< "path2(): " << ex.path2() << '\n';}return 0;
}
6.file_status类:获取或设置有关文件类型(type)和权限(permissions)的信息
(1).type: 获取或设置文件类型信息;
(2).permissions: 获取或设置文件权限信息。
测试代码如下所示:
void demo_status(const fs::path& p, fs::file_status s)
{std::cout << p;switch (s.type()) {case fs::file_type::none:std::cout << " has `not-evaluated-yet` type";break;case fs::file_type::not_found:std::cout << " does not exist";break;case fs::file_type::regular:std::cout << " is a regular file";break;case fs::file_type::directory:std::cout << " is a directory";break;case fs::file_type::symlink:std::cout << " is a symlink";break;case fs::file_type::block:std::cout << " is a block device";break;case fs::file_type::character:std::cout << " is a character device";break;case fs::file_type::fifo:std::cout << " is a named IPC pipe";break;case fs::file_type::socket:std::cout << " is a named IPC socket";break;case fs::file_type::unknown:std::cout << " has `unknown` type";break;default:std::cout << " has `implementation-defined` type";break;}std::cout << '\n';
}void demo_perms(fs::perms p)
{using fs::perms;auto show = [=](char op, perms perm) {std::cout << (perms::none == (perm & p) ? '-' : op);};show('r', perms::owner_read);show('w', perms::owner_write);show('x', perms::owner_exec);show('r', perms::group_read);show('w', perms::group_write);show('x', perms::group_exec);show('r', perms::others_read);show('w', perms::others_write);show('x', perms::others_exec);std::cout << '\n';
}int test_filesystem_file_status()
{
#ifdef _MSC_VERconst std::string path{ "../../../testdata/list.txt" };
#elseconst std::string path{ "../../testdata/list.txt" };
#endif// 1. type// windows: "../../../testdata/list.txt" is a regular file// linux: "../../testdata/list.txt" is a regular filedemo_status(path, fs::status(path));// 2. permissionsdemo_perms(fs::status(path).permissions()); // rwxrwxrwxreturn 0;
}
7.space_info结构体:获取有关文件系统上的空闲(free)和可用空间(available space)的信息
struct space_info {std::uintmax_t capacity; // 总大小,以字节为单位std::uintmax_t free; // 可用空间,以字节为单位std::uintmax_t available; // 非特权进程可用的可用空间(可能等于或小于可用空间)
};
float get_file_size(std::uintmax_t size, std::string& suffix)
{float s1 = size / 1024. / 1024 / 1024;float s2 = size / 1024. / 1024;float s3 = size / 1024.;if (s1 > 1) {suffix = " GB";return s1;}if (s2 > 1) {suffix = " MB";return s2;}if (s3 > 1) {suffix = " KB";return s3;}suffix = " Bytes";return size;
}int test_filesystem_space_info()
{fs::space_info info = fs::space(fs::current_path());std::cout << "current path: " << fs::current_path() << " ";// windows: current path: "E:\\GitCode\\Messy_Test\\prj\\x86_x64_vc12\\CppBaseTest" size: 311.00 GB size: 189.23 GB size: 189.23 GB// linux: current path: "/home/spring/GitCode/Messy_Test/prj/linux_cmake_CppBaseTest" size: 311.00 GB size: 189.23 GB size: 189.23 GBfor (auto x : { info.capacity, info.free, info.available }) {std::string suffix;auto value = get_file_size(static_cast<std::intmax_t>(x), suffix);std::cout << " size: " << std::fixed << std::setprecision(2) << value << suffix << " ";}std::cout << std::endl;return 0;
}
8.file_type枚举类:文件的类型
enum class file_type {none = /* unspecified */,not_found = /* unspecified */,regular = /* unspecified */,directory = /* unspecified */,symlink = /* unspecified */,block = /* unspecified */,character = /* unspecified */,fifo = /* unspecified */,socket = /* unspecified */,unknown = /* unspecified */,/* implementation-defined */
};
9.perms枚举类:文件访问权限,如下图所示

10.perm_options枚举类:控制函数std::filesystem::permissions()行为的可用选项,如下图所示:
enum class perm_options {replace = /* unspecified */,add = /* unspecified */,remove = /* unspecified */,nofollow = /* unspecified */
};

11.非成员函数:
(1).absolute:返回绝对路径;
(2).canonical, weakly_canonical: 将指定路径转换为规范绝对路径(canonical absolute path),指定的路径必须存在;
(3).relative, proximate: 返回相对路径;
(4).copy: 拷贝文件或目录,会生成新的文件或目录,from指定的文件或目录必须存在,to指定的文件或目录必须不存在;
(5).copy_file: 拷贝文件,会生成新的文件,from指定的文件必须存在,to指定的文件必须不存在;若发生错误,则返回false;
(6).copy_symlink:拷贝符号链接;
(7).create_directory, create_directories: 创建新目录,使用create_directory时要求父目录必须已存在,即create_directory不支持多级创建,而create_directories没有这些限制;
(8).create_hard_link:创建硬链接;
(9).create_symlink, create_directory_symlink: 创建符号链接;
(10).current_path: 获取当前工作目录;
(11).exists: 检查指定的文件或目录是否存在;
(12).equivalent: 检查两个路径是否是相同的;
(13).file_size: 获取文件大小;
(14).hard_link_count: 获取指定路径硬链接数;
(15).last_write_time: 获取或设置指定路径最后一次修改时间;
(16).permissions: 修改文件访问权限;
(17).read_symlink: 获取符号链接的target;
(18).remove, remove_all:删除文件或空目录;remove_all可递归地删除文件或目录及其所有内容并返回已删除的文件和目录的数量;
(19).rename: 重命名文件或目录;
(20).resize_file: 更改常规文件大小;
(21).space: 获取指定的路径的可用空间;
(22).status, symlink_status: 获取文件属性,如指定路径是否是常规文件、是否是目录等;
(23).temp_directory_path: 返回适合临时文件的目录。
std::error_code类是与平台相关的错误码。std::filesystem中的所有函数都有一个对应非抛出异常的对等接口。
测试代码如下所示:
int test_filesystem_non_member_functions()
{const fs::path p1 = "../funset.cpp";
#ifdef _MSC_VERconst fs::path p2{ "../../../testdata/list.txt" }, p3{ "../../../testdata/list_copy.txt" }, p4{ "E:\\yulong.mp4" }, p5{ "../../../testdata/list_new.txt" };
#elseconst fs::path p2{ "../../testdata/list.txt" }, p3{ "../../testdata/list_copy.txt" }, p4{ "./build/CppBaseTest" }, p5{"../../testdata/list_new.txt"};
#endif// windows: current path is "E:\\GitCode\\Messy_Test\\prj\\x86_x64_vc12\\CppBaseTest"// linux: current path is "/home/spring/GitCode/Messy_Test/prj/linux_cmake_CppBaseTest"std::cout << "current path is " << fs::current_path() << '\n';// 1. absolute// windows: absolute path for "../funset.cpp" is "E:\\GitCode\\Messy_Test\\prj\\x86_x64_vc12\\funset.cpp"// linux: absolute path for "../funset.cpp" is "/home/spring/GitCode/Messy_Test/prj/linux_cmake_CppBaseTest/../funset.cpp"std::cout << "absolute path for " << p1 << " is " << fs::absolute(p1) << '\n';// 2. canonical, weakly_canonical/* windows:canonical path: "E:\\GitCode\\Messy_Test\\testdata\\list.txt"weakly canonical path: "E:\\GitCode\\Messy_Test\\testdata\\list.txt" *//* linux:canonical path: "/home/spring/GitCode/Messy_Test/testdata/list.txt"weakly canonical path: "/home/spring/GitCode/Messy_Test/testdata/list.txt" */std::cout << "canonical path: " << fs::canonical(p2) << "\n";std::cout << "weakly canonical path: " << fs::weakly_canonical(p2) << "\n";// 3. relative, proximatestd::cout << "relative path: " << fs::relative("/a/b/c", "/a/b")<< ", proximat path: " << fs::proximate("/a/b/c", "/a/b") << "\n"; // relative path: "c", proximat path: "c"// 4. copy, exists, removeif (fs::exists(p3))fs::remove(p3);fs::copy(p2, p3);// 5. copy_fileif (fs::exists(p3))fs::remove(p3);fs::copy_file(p2, p3);// 6. create_directory, create_directoriesfs::create_directory("./a");fs::create_directories("./b/c/d");// 7. equivalentif (fs::equivalent(".", fs::current_path()))std::cout << "they are equal" << "\n";// 8. file_sizestd::string suffix;auto value = get_file_size(static_cast<std::intmax_t>(fs::file_size(p4)), suffix);// windows: size: 1.35 GB; linux: size: 7.61 MBstd::cout << "size: " << std::fixed << std::setprecision(2) << value << suffix << "\n";// 9. last_write_time// windows: last write time: 2023-08-19 22:42:56// linux: last write time: 2023-10-03 12:32:49std::cout << "last write time: " << to_time_t(last_write_time(p4)) << std::endl;// 10. permissions// windows: rwxrwxrwx r-xr-xr-x// linux: rw-rw-r-- -w-r-----demo_perms(fs::status(p3).permissions());
#ifdef _MSC_VERfs::permissions(p3, fs::perms::none);
#elsefs::permissions(p3, fs::perms::owner_write | fs::perms::group_read);
#endifdemo_perms(fs::status(p3).permissions());// 11. renameif (fs::exists(p5))fs::remove(p5);fs::rename(p3, p5);// 12. resize_file// linux: size: 187.00 Bytes size: 64.00 KBvalue = get_file_size(static_cast<std::intmax_t>(fs::file_size(p5)), suffix);std::cout << "size: " << std::fixed << std::setprecision(2) << value << suffix << "\n";
#ifdef __linux__fs::resize_file(p5, 64 * 1024); // resize to 64 KB, windows crashvalue = get_file_size(static_cast<std::intmax_t>(fs::file_size(p5)), suffix);std::cout << "size: " << std::fixed << std::setprecision(2) << value << suffix << "\n";
#endif// 13. temp_directory_path// windows: temp directory is: "C:\\Users\\f06190\\AppData\\Local\\Temp\\"// linux: temp directory is: "/tmp"std::cout << "temp directory is: " << fs::temp_directory_path() << "\n";// std::error_codestd::error_code ec;fs::copy_file("xxx", "yyy", ec); // does not throw// windows: error code: 2,系统找不到指定的文件。// linux: error code: 2,No such file or directorystd::cout << "error code: " << ec.value() << "," << ec.message() << "\n";try {fs::copy_file("xxx", "yyy");} catch (fs::filesystem_error const& ex) {std::cout << "what(): " << ex.what() << '\n'<< "path1(): " << ex.path1() << '\n'<< "path2(): " << ex.path2() << '\n'<< "code().value(): " << ex.code().value() << '\n'<< "code().message(): " << ex.code().message() << '\n'<< "code().category(): " << ex.code().category().name() << '\n';}return 0;
}
执行结果如下图所示:

12.文件类型:
(1).is_block_file: 检查给定的文件或路径是否是块设备;
(2).is_character_file: 检查给定的文件或路径是否是字符设备;
(3).is_directory: 检查给定的文件或路径是否是目录;
(4).is_empty: 检查给定的文件或路径是否是空文件或空目录;
(5).is_fifo: 检查给定的文件或路径是否是命名管道;
(6).is_other: 检查给定的文件或路径是否是其它文件;
(7).is_regular_file: 检查给定的文件或路径是否是常规文件;
(8).is_socket: 检查给定的文件或路径是否是套接字;
(9).is_symlink: 检查给定的文件或路径是否是符号链接;
(10).status_known: 检查给定的文件是否已知。
测试代码如下所示:
void demo_status2(const fs::path& p, fs::file_status s)
{std::cout << p;// alternative: switch(s.type()) { case fs::file_type::regular: ...}if (fs::is_regular_file(s))std::cout << " is a regular file\n";if (fs::is_directory(s))std::cout << " is a directory\n";if (fs::is_block_file(s))std::cout << " is a block device\n";if (fs::is_character_file(s))std::cout << " is a character device\n";if (fs::is_fifo(s))std::cout << " is a named IPC pipe\n";if (fs::is_socket(s))std::cout << " is a named IPC socket\n";if (fs::is_symlink(s))std::cout << " is a symlink\n";if (!fs::exists(s))std::cout << " does not exist\n";//if (fs::is_empty(p))// std::cout << " is empty\n";if (fs::is_other(s)) // equivalent to exists(s) && !is_regular_file(s) && !is_directory(s) && !is_symlink(s)std::cout << " is other file\n";//if (fs::status_known(s)) // equivalent to s.type() != file_type::none// std::cout << " is status known\n";
}int test_filesystem_file_types()
{demo_status2("/dev/null", fs::status("/dev/null"));demo_status2("/dev/sda", fs::status("/dev/sda"));demo_status2(fs::current_path(), fs::status(fs::current_path()));demo_status2("/xxx/yyy", fs::status("/xxx/yyy"));demo_status2("/usr/bin/g++", fs::status("usr/bin/g++"));demo_status2("../../../testdata/list.txt", fs::status("../../../testdata/list.txt"));demo_status2("../../testdata/list.txt", fs::status("../../testdata/list.txt"));demo_status2("/mnt", fs::status("/mnt"));return 0;
}
GitHub:https://github.com/fengbingchun/Messy_Test
相关文章:
C++17中头文件filesystem的使用
C17引入了std::filesystem库(文件系统库, filesystem library),相关类及函数的声明在头文件filesystem中,命名空间为std::filesystem。 1.path类:文件路径相关操作,如指定的路径是否存在等,其介绍参见:http…...
「专题速递」数字人直播带货、传统行业数字化升级、远程协作中的低延时视频、地产物业中的通讯终端...
音视频技术作为企业数字化转型的核心要素之一,已在各行各业展现出广泛的应用和卓越的价值。实时通信、社交互动、高清视频等技术不仅令传统行业焕发新生,还为其在生产、管理、服务提供与维护等各个领域带来了巨大的助力,实现了生产效率和服务…...
PE格式之PE头部
1. PE头部总体组成 2. DOS MZ头 3. PE头 PE头由3部分组成: 下面分别: OptionalHeader比较大: 然后是节表, 节表有多个: PE文件头部就结束了, 最后就是节区了, 来看几段代码: ; main.asm .586 .model flat, stdcall option casemap:noneinclude windows.inc include ke…...
SLAM从入门到精通(用python实现机器人运动控制)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在ROS下面,开发的方法很多,可以是c,可以是python。大部分接口操作类的应用,其实都可以用python来开…...
接口和抽象类有什么区别?
接口和抽象类都是用于实现抽象类型的机制: 抽象类:抽象类可以包含抽象方法(未实现的方法)和具体方法(已实现的方法)。抽象类可以有字段(成员变量),这些字段可以是具体的,也可以是抽象的。一个类只能继承一个抽象类,Java不支持多继承。抽象类可以拥有构造方法,用于初…...
基于springboot+vue的人事系统
目录 前言 一、技术栈 二、系统功能介绍 员工信息管理 考勤信息管理 考勤信息管理 下班记录管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,作为学校以及一些培训机构,都在用信息…...
记住这份软件测试八股文还怕不能拿offer?你值得拥有
前言 2023秋招即将来临,很多同学会问软件测试面试八股文有必要背吗? 我的回答是:很有必要。你可以讨厌这种模式,但你一定要去背,因为不背你就进不了大厂。 国内的互联网面试,恐怕是现存的、最接近科举考试…...
2023年,在CSDN拥有10000粉丝有多难?
该数据来源于粉丝数人数排行前5000名用户的关注用户列表中产生的,由于采集样本数有限,数据可能具有一定的误差,仅供参考,本次采样用户数大概在100万以上。 筛选条件人数粉丝人数大于50007519粉丝人数大于100003763粉丝人数大于500…...
C++ -- 学习系列 关联式容器 set 与 map
一 关联式容器是什么? c 中有两种容器类型:关联式容器与序列式容器(顺序容器) 关联式中的容器是按照关键字来存储与访问的,序列式容器(顺序容器)则是元素在容器中的相对位置来存储与访问的。…...
Day 04 python学习笔记
Python数据容器 元组 元组的声明 变量名称(元素1,元素2,元素3,元素4…….) (元素类型可以不同) eg: tuple_01 ("hello", 1, 2,-20,[11,22,33]) print(type(tuple_01))结果&#x…...
Moonbeam Ignite强势回归
参与Moonbeam上最新的流动性计划 还记得新一轮的流动性激励计划吗?Moonbeam Ignite社区活动带着超过300万枚GLMR奖励来啦!体验新项目,顺便薅一把GLMR羊毛。 本次Moonbeam Ignite活动的参与项目均为第二批Moonbeam生态系统Grant资助提案中获…...
【改造后序遍历算法】95. 不同的二叉搜索树 II
95. 不同的二叉搜索树 II 解题思路 遍历每一个节点查看以k为根节点的二叉搜索树储存所有左子树的根节点储存所有右子树的根节点将左子树和右子树组装起来 将根节点储存在向量中 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeN…...
栈的基本操作(数据结构)
顺序栈的基本操作 #include <stdlib.h> #include <iostream> #include <stdio.h> #define MaxSize 10typedef struct{int data[MaxSize];int top; }SqStack;//初始化栈 void InitStack(SqStack &S){S.top -1; } //判断栈空 bool StackEmpty(SqStack S)…...
D. Jellyfish and Mex Codeforces Round 901 (Div. 2)
Problem - D - Codeforces 题目大意:有一个n个数的数组a,数m初始为0,每次操作可以删除任意一个数,然后m加上那个数,求n次操作和m的最小值 1<n<5000;0<a[i]<1e9 思路:可以发现&am…...
操作系统内存管理相关
1. 虚拟内存 1.1 什么是虚拟内存 虚拟内存是计算机系统内存管理的一种技术,我们可以手动设置自己电脑的虚拟内存。不要单纯认为虚拟内存只是“使用硬盘空间来扩展内存“的技术。虚拟内存的重要意义是它定义了一个连续的虚拟地址空间,并且 把内存扩展到硬…...
Sui流动性质押黑客松获胜者公布,助力资产再流通
Sui流动质押黑客松于日前结束Demo Day演示,其中有五个团队获奖、六个团队荣誉提名,共有超过30个项目获得参赛资格。此外,有两个团队赢得了Sui上DeFi协议提供的赏金。 本次黑客松的目的是挖掘并奖励将流动质押功能集成到其apps和产品中的开发…...
为什么在使用PageHelper插件时,指定的每页记录数大小失效?显示所有的记录数
1.问题现象: 这里指定每页显示5条,却把所有的记录数都显示出来了 2.分析: 之前是可以的,然后发现:PageHelper.startPage(pageNum,pageSize) 和执行sql的语句 顺序颠倒了,然后就出错了。 3.验证…...
XML文档基础
什么是XML XML (eXtensible Markup Language,可扩展标记语言) 是一种用于存储和传输数据的文本文件格式。用户可以按照XML规则自定义标记,XML 的设计目标是传输数据,而不是显示数据,因此它是一种通用的标记语言,可用于…...
软考知识汇总-软件工程
软件工程 1 能力成熟度模型(CMM)2 能力成熟度模型集成(CMMI)2.1阶段式模型2.2 连续式模型 3 软件过程模型 1 能力成熟度模型(CMM) 将软件工程成熟度分为5个级别 初始级:杂乱无章,很…...
力扣:119. 杨辉三角 II(Python3)
题目: 给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 来源:力扣(LeetCode) 链接:力扣(LeetCode)…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
