c++ filesystem详解(1) - 概念 c++ file.open
liebian365 2024-11-05 11:50 3 浏览 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
相关推荐
- 快递查询教程,批量查询物流,一键管理快递
-
作为商家,每天需要查询许许多多的快递单号,面对不同的快递公司,有没有简单一点的物流查询方法呢?小编的回答当然是有的,下面随小编一起来试试这个新技巧。需要哪些工具?安装一个快递批量查询高手快递单号怎么快...
- 一键自动查询所有快递的物流信息 支持圆通、韵达等多家快递
-
对于各位商家来说拥有一个好的快递软件,能够有效的提高自己的工作效率,在管理快递单号的时候都需要对单号进行表格整理,那怎么样能够快速的查询所有单号信息,并自动生成表格呢?1、其实方法很简单,我们不需要一...
- 快递查询单号查询,怎么查物流到哪了
-
输入单号怎么查快递到哪里去了呢?今天小编给大家分享一个新的技巧,它支持多家快递,一次能查询多个单号物流,还可对查询到的物流进行分析、筛选以及导出,下面一起来试试。需要哪些工具?安装一个快递批量查询高手...
- 3分钟查询物流,教你一键批量查询全部物流信息
-
很多朋友在问,如何在短时间内把单号的物流信息查询出来,查询完成后筛选已签收件、筛选未签收件,今天小编就分享一款物流查询神器,感兴趣的朋友接着往下看。第一步,运行【快递批量查询高手】在主界面中点击【添...
- 快递单号查询,一次性查询全部物流信息
-
现在各种快递的查询方式,各有各的好,各有各的劣,总的来说,还是有比较方便的。今天小编就给大家分享一个新的技巧,支持多家快递,一次能查询多个单号的物流,还能对查询到的物流进行分析、筛选以及导出,下面一起...
- 快递查询工具,批量查询多个快递快递单号的物流状态、签收时间
-
最近有朋友在问,怎么快速查询单号的物流信息呢?除了官网,还有没有更简单的方法呢?小编的回答当然是有的,下面一起来看看。需要哪些工具?安装一个快递批量查询高手多个京东的快递单号怎么快速查询?进入快递批量...
- 快递查询软件,自动识别查询快递单号查询方法
-
当你拥有多个快递单号的时候,该如何快速查询物流信息?比如单号没有快递公司时,又该如何自动识别再去查询呢?不知道如何操作的宝贝们,下面随小编一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号若干...
- 教你怎样查询快递查询单号并保存物流信息
-
商家发货,快递揽收后,一般会直接手动复制到官网上一个个查询物流,那么久而久之,就会觉得查询变得特别繁琐,今天小编给大家分享一个新的技巧,下面一起来试试。教程之前,我们来预览一下用快递批量查询高手...
- 简单几步骤查询所有快递物流信息
-
在高峰期订单量大的时候,可能需要一双手当十双手去查询快递物流,但是由于逐一去查询,效率极低,追踪困难。那么今天小编给大家分享一个新的技巧,一次能查询多个快递单号的物流,下面一起来学习一下,希望能给大家...
- 物流单号查询,如何查询快递信息,按最后更新时间搜索需要的单号
-
最近有很多朋友在问,如何通过快递单号查询物流信息,并按最后更新时间搜索出需要的单号呢?下面随小编一起来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?运行【快递批量查询高手】...
- 连续保存新单号功能解析,导入单号查询并自动识别批量查快递信息
-
快递查询已经成为我们日常生活中不可或缺的一部分。然而,面对海量的快递单号,如何高效、准确地查询每一个快递的物流信息,成为了许多人头疼的问题。幸运的是,随着科技的进步,一款名为“快递批量查询高手”的软件...
- 快递查询教程,快递单号查询,筛选更新量为1的单号
-
最近有很多朋友在问,怎么快速查询快递单号的物流,并筛选出更新量为1的单号呢?今天小编给大家分享一个新方法,一起来试试吧。需要哪些工具?安装一个快递批量查询高手多个快递单号怎么快速查询?运行【快递批量查...
- 掌握批量查询快递动态的技巧,一键查找无信息记录的两种方法解析
-
在快节奏的商业环境中,高效的物流查询是确保业务顺畅运行的关键。作为快递查询达人,我深知时间的宝贵,因此,今天我将向大家介绍一款强大的工具——快递批量查询高手软件。这款软件能够帮助你批量查询快递动态,一...
- 从复杂到简单的单号查询,一键清除单号中的符号并批量查快递信息
-
在繁忙的商务与日常生活中,快递查询已成为不可或缺的一环。然而,面对海量的单号,逐一查询不仅耗时费力,还容易出错。现在,有了快递批量查询高手软件,一切变得简单明了。只需一键,即可搞定单号查询,一键处理单...
- 物流单号查询,在哪里查询快递
-
如果在快递单号多的情况,你还在一个个复制粘贴到官网上手动查询,是一件非常麻烦的事情。于是乎今天小编给大家分享一个新的技巧,下面一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号怎么快速查询?...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 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)