c++ filesystem详解(1) - 概念 c++ file.open
liebian365 2024-11-05 11:50 14 浏览 0 评论
c++17 文件系统引入标准库了,极大地提高了生产效率, 降低开发难度。
开发者了解文件系统的共性, 不用过度关注各平台的特殊性, 就可以实现工业功能。
这个系列将详细地学习。
0. 定义
- 文件:持有数据的文件系统对象,能被写入或读取,或二者皆可。
文件拥有名称及属性,属性之一是文件类型:
a. *目录*:表现为目录条目的容器的文件,
目录条目标识其他文件(其中一些可以是另外的嵌套的目录)。
讨论到具体文件时,包含该文件目录条目的目录是其*父目录*。
父目录能以相对路径名 ".." 表示。
b. *常规文件*:关联一个名字到一个既存文件的目录条目(即*硬链接*)。
若支持多重硬链接,则文件在最后一个到它的硬链接被移除后才被移除。
c. *符号链接*:关联一个名词到一个路径的目录条目,路径可以存在亦可不存在。
d. 其他特殊文件类型:*块*、*字符*、*FIFO*、*套接字*
- 文件名:命名一个文件的字符串。容许字符、大小写区别、最大长度以及被禁止名称是实现定义的。名称 "." (点)与 ".." (点点)在库层次拥有特殊含义。
- 路径:标识一个文件的元素序列。它以可选的 根名 (例如 Windows 上的 "C:" 或 "//server")开始,后随可选的 根目录(例如 Unix 上的 "/"),后随零或更多个文件名(除了最后一个都必须是目录或到目录的链接)的序列。表示路径的字符串(路径名)的原生格式(如哪些字符被用作分隔符)与字符编码是实现定义的,此库提供路径的可移植表示。
- 绝对路径:无歧义地标识一个文件位置的路径。
- 规范路径:不包含符号链接、"." 或 ".." 元素的绝对路径。
- 相对路径:标识相对于文件系统中某位置的文件位置的路径。特殊路径名 "."(点,“当前目录”)和 ".."(点点、“父目录”)是相对路径。
1. 列表(类、函数、类型)
在标头 <filesystem> 定义 | |
在命名空间 std::filesystem 定义 | |
类 | |
path | 表示路径 (类) |
filesystem_error | 文件系统错误时抛出的异常 (类) |
directory_entry | 目录条目 (类) |
directory_iterator | 指向目录内容的迭代器 (类) |
recursive _directory _iterator | 指向一个目录及其子目录的内容的迭代器 (类) |
file_status | 表示文件类型及权限 (类) |
space_info | 关于文件系统上空闲及可用空间的信息 (类) |
file_type | 文件的类型 (枚举) |
perms | 标识文件系统权限 (枚举) |
perm_options | 指定权限操作的语义 (枚举) |
copy_options | 指定复制操作的语义 (枚举) |
directory_options | 用于迭代目录内容的选项 (枚举) |
file_time_type | 表示文件时间值 (typedef) |
非成员函数 | |
absolute | 组成一个绝对路径 (函数) |
canonicalweakly _canonical | 组成一个规范路径 (函数) |
relativeproximate | 组成一个相对路径 (函数) |
copy | 复制文件或目录 (函数) |
copy_file | 复制文件内容 (函数) |
copy_symlink | 复制一个符号链接 (函数) |
create _directorycreate _directories | 创建新目录 (函数) |
create_hard_link | 创建一个硬链接 (函数) |
create _symlinkcreate _directory_symlink | 创建一个符号链接 (函数) |
current_path | 返回或设置当前工作目录 (函数) |
exists | 检查路径是否指代既存的文件系统对象 (函数) |
equivalent | 检查两个路径是否指代同一文件系统对象 (函数) |
file_size | 返回文件的大小 (函数) |
hard_link_count | 返回指代特定文件的硬链接数 (函数) |
last_write_time | 获取或设置最近一次数据修改的时间 (函数) |
permissions | 修改文件访问权限 (函数) |
read_symlink | 获得符号链接的目标 (函数) |
removeremove _all | 移除一个文件或空目录 移除一个文件或递归地移除一个目录及其所有内容 (函数) |
rename | 移动或重命名一个文件或目录 (函数) |
resize_file | 以截断或填充零更改一个常规文件的大小 (函数) |
space | 确定文件系统上的可用空闲空间 (函数) |
statussymlink _status | 确定文件属性 确定文件属性,检查符号链接目标 (函数) |
temp _directory_path | 返回一个适用于临时文件的目录 (函数) |
文件类型 | |
is_block_file | 检查给定的路径是否表示块设备 (函数) |
is_character _file | 检查给定的路径是否表示字符设备 (函数) |
is_directory | 检查给定的路径是否表示一个目录 (函数) |
is_empty | 检查给定的路径是否表示一个空文件或空目录 (函数) |
is_fifo | 检查给定的路径是否表示一个命名管道 (函数) |
is_other | 检查参数是否表示一个其他文件 (函数) |
is_regular_file | 检查参数是否表示一个常规文件 (函数) |
is_socket | 检查参数是否表示一个具名 IPC 套接字 (函数) |
is_symlink | 检查参数是否表示一个符号链接 (函数) |
status_known | 检查文件状态是否已知 (函数) |
2. 概念
2.1 文件类型(file_type)
_EXPORT_STD enum class file_type {
none,
not_found,
regular,
directory,
symlink,
block, // not used on Windows
character, // not used in this implementation; theoretically some special files like CON
// might qualify, but querying for this is extremely expensive and unlikely
// to be useful in practice
fifo, // not used on Windows (\\.\pipe named pipes don't behave exactly like POSIX fifos)
socket, // not used on Windows
unknown,
junction // implementation-defined value indicating an NT junction
};
file_type 定义了一些常量,指示路径所指代的文件或目录的类型
常量
常量 | 含义 |
none | 指示文件状态未被求值,或求值时出错 |
not_found | 指示文件未找到(这不被认为是错误) |
regular | 常规文件 |
directory | 目录 |
symlink | 符号链接 |
block | 块特殊文件 |
character | 字符特殊文件 |
fifo | FIFO(又称管道)文件 |
socket | 套接字文件 |
实现定义 | 每个实现支持的附加文件类型的附加实现定义常量(例如,MSVC STL 定义了 junction 用于NTFS 连接点) |
unknown | 文件存在但无法确定其类型 |
2.2 文件系统权限(perms)
_EXPORT_STD enum class perms {
none = 0,
owner_read = 0400,
owner_write = 0200,
owner_exec = 0100,
owner_all = 0700,
group_read = 0040,
group_write = 0020,
group_exec = 0010,
group_all = 0070,
others_read = 0004,
others_write = 0002,
others_exec = 0001,
others_all = 0007,
all = 0777, // returned for all files without FILE_ATTRIBUTE_READONLY
set_uid = 04000,
set_gid = 02000,
sticky_bit = 01000,
mask = 07777,
unknown = 0xFFFF,
_All_write = owner_write | group_write | others_write,
_File_attribute_readonly = all & ~_All_write // returned for files with FILE_ATTRIBUTE_READONLY
};
此类型表示文件访问权限。
perms 满足位掩码类型 (BitmaskType) 的规定
(这意味着此类型定义了按位运算符
operator&、
operator|、
operator^、
operator~、
operator&=、
operator|=
和 operator^= 等)。
none 代表空的位掩码;别的每个枚举项均代表一个不同的位掩码元素。
访问权限模仿 POSIX 权限位,而且任何单独的文件权限(由 filesystem::status 报告)都是下列位的某些组合:
成员常量
成员常量 | 值(八进制) | (POSIX 等价) - 含义 |
none | 0 | 未设权限位 |
owner_read | 0400 | (S_IRUSR) - 文件拥有者拥有读权限 |
owner_write | 0200 | (S_IWUSR) -文件拥有者拥有写权限 |
owner_exec | 0100 | (S_IXUSR) -文件拥有着拥有执行/查找权限 |
owner_all | 0700 | (S_IRWXU) -文件拥有者拥有读、写、执行/查找权限等价于 owner_read | owner_write | owner_exec |
group_read | 040 | (S_IRGRP) -文件用户组拥有读权限 |
group_write | 020 | (S_IWGRP) -文件用户组拥有写权限 |
group_exec | 010 | (S_IXGRP) -文件用户组拥有执行/查找权限 |
group_all | 070 | (S_IRWXG) -文件用户组拥有读、写、执行/查找权限等价于 group_read | group_write | group_exec |
others_read | 04 | (S_IROTH) -其他用户拥有读权限 |
others_write | 02 | (S_IWOTH) -其他用户拥有写权限 |
others_exec | 01 | (S_IXOTH) -其他用户拥有执行/查找权限 |
others_all | 07 | (S_IRWXO) -其他用户拥有拥有读、写及执行/查找权限等价于 others_read | others_write | others_exec |
all | 0777 | |
set_uid | 04000 | (S_ISUID) -在执行时设置用户 ID 为文件拥有者的用户 ID |
set_gid | 02000 | (S_ISGID) -在执行时设置组 ID 为文件用户的组 ID |
sticky_bit | 01000 | (S_ISVTX) -实现定义的含义,不过 POSIX XSI 指定在设置于目录时,唯有文件拥有者可以删除文件,即使该目录对其他人可写(与 /tmp 一并使用) |
mask | 07777 |
另外,定义此类型的下列常量,它不表示权限:
成员常量 | 值 十六进制 | 含义 |
unknown | 0xFFFF | 未知权限(例如当 filesystem::file_status 以不带权限创建时) |
2.3 权限操作选项(perm_options)
_EXPORT_STD enum class perm_options { replace = 0x1,
add = 0x2,
remove = 0x4,
nofollow = 0x8 };
此类型表示控制函数 std::filesystem::permissions() 行为的可用选项。
perm_options 满足位掩码类型 (BitmaskType) 的规定 :
(这意味着此类型定义了按位运算符
operator&、
operator|、
operator^、
operator~、
operator&=、
operator|=
和 operator^= 等)
成员常量
add、remove、replace 至多可以存在一个,否则 permissions 函数的行为未定义。
成员常量 | 含义 |
replace | 以给 permissions() 的实参完全替换权限(默认行为) |
add | 以当前权限和实参的逐位或替换权限 |
remove | 以当前权限和实参取反结果的逐位与替换权限 |
nofollow | 将更改符号链接自身,而非其所解析到的文件的权限 |
2.4 复制操作选项(copy_options)
_EXPORT_STD enum class copy_options {
none = static_cast<int>(__std_fs_copy_options::_None),
_Existing_mask = static_cast<int>(__std_fs_copy_options::_Existing_mask),
skip_existing = static_cast<int>(__std_fs_copy_options::_Skip_existing),
overwrite_existing = static_cast<int>(__std_fs_copy_options::_Overwrite_existing),
update_existing = static_cast<int>(__std_fs_copy_options::_Update_existing),
recursive = 0x10,
_Symlinks_mask = 0xF00,
copy_symlinks = 0x100,
skip_symlinks = 0x200,
_Copy_form_mask = 0xF000,
directories_only = 0x1000,
create_symlinks = 0x2000,
create_hard_links = 0x4000,
_Unspecified_copy_prevention_tag = 0x10000 // to be removed by LWG-3057
};
此类型代表控制 copy() 及 copy_file() 函数行为的可用选项。
copy_options 满足BitmaskType 的规定
(这意味着此类型定义了按位运算符
operator&__NOINDEX__、
operator|__NOINDEX__、
operator^__NOINDEX__、
operator~__NOINDEX__、
operator&=__NOINDEX__、
operator|=__NOINDEX__
和 operator^=__NOINDEX__ 等)
none 代表空的位掩码;别的每个枚举项均代表一个不同的位掩码元素。
成员常量
每个下列选项组中至多存在一个选项,否则复制函数的行为未定义。
成员常量 | 含义 |
文件已存在时控制 copy_file() 的选项 | |
none | 报告错误(默认行为)。 |
skip_existing | 保持既存文件,而不报告错误。 |
overwrite_existing | 替换既存文件。 |
update_existing | 替换既存文件,仅若它旧于被复制的文件。 |
在子目录上控制 copy() 效果的选项 | |
none | 跳过子目录(默认行为)。 |
recursive | 递归地复制子目录及其内容。 |
在符号链接上控制 copy() 效果的选项 | |
none | 跟随符号链接(默认行为)。 |
copy_symlinks | 复制符号链接为符号链接,而非其所指的文件。 |
skip_symlinks | 忽略符号链接。 |
控制 copy() 所做的复制类型的选项 | |
none | 复制文件内容(默认行为)。 |
directories_only | 复制目录结构,但不复制任何非目录文件。 |
create_symlinks | 创建指向原有文件的符号链接,而不创建文件副本。注意:源路径必须是绝对路径,除非目标路径在当前目录中。 |
create_hard_links | 创建解析到与原有文件相同文件的硬链接,而不创建文件副本。 |
2.5 迭代目录选项(directory_options)
_EXPORT_STD enum class directory_options { none = 0,
follow_directory_symlink = 1,
skip_permission_denied = 2 };
此类型表示控制 directory_iterator 及 recursive_directory_iterator 行为的可用选项。
directory_options 满足BitmaskType 的规定
(这意味着此类型定义了按位运算符
operator&__NOINDEX__、
operator|__NOINDEX__、
operator^__NOINDEX__、
operator~__NOINDEX__、
operator&=__NOINDEX__、
operator|=__NOINDEX__
和 operator^=__NOINDEX__ 等)
none 代表空的位掩码;别的每个枚举项均代表一个不同的位掩码元素。
成员常量
成员常量 | 含义 |
none | (默认)跳过符号链接,权限拒绝是错误。 |
follow_directory_symlink | 跟随而非跳过符号链接。 |
skip_permission_denied | 跳过若不跳过就会产生权限拒绝错误的目录。 |
2.6 文件时间(file_time_type)
#if _HAS_CXX20
_EXPORT_STD using file_time_type = _CHRONO time_point<_CHRONO file_clock>;
#else // ^^^ _HAS_CXX20 / !_HAS_CXX20 vvv
using file_time_type = _CHRONO time_point<filesystem::_File_time_clock>;
#endif // ^^^ !_HAS_CXX20
相关推荐
- 4万多吨豪华游轮遇险 竟是因为这个原因……
-
(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...
- “菜鸟黑客”必用兵器之“渗透测试篇二”
-
"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...
- 科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白
-
作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...
- 麦子陪你做作业(二):KEGG通路数据库的正确打开姿势
-
作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...
- 知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势
-
智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...
- 每日新闻播报(September 14)_每日新闻播报英文
-
AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...
- 香港新巴城巴开放实时到站数据 供科技界研发使用
-
中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...
- 5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper
-
本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...
- Qt动画效果展示_qt显示图片
-
今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...
- 如何从0到1设计实现一门自己的脚本语言
-
作者:dong...
- 三年级语文上册 仿写句子 需要的直接下载打印吧
-
描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...
- C++|那些一看就很简洁、优雅、经典的小代码段
-
目录0等概率随机洗牌:1大小写转换2字符串复制...
- 二年级上册语文必考句子仿写,家长打印,孩子照着练
-
二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)