百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

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^= 等)

成员常量

addremovereplace 至多可以存在一个,否则 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_iteratorrecursive_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字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: