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)…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...