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

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

成员常量

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

相关推荐

快递查询教程,批量查询物流,一键管理快递

作为商家,每天需要查询许许多多的快递单号,面对不同的快递公司,有没有简单一点的物流查询方法呢?小编的回答当然是有的,下面随小编一起来试试这个新技巧。需要哪些工具?安装一个快递批量查询高手快递单号怎么快...

一键自动查询所有快递的物流信息 支持圆通、韵达等多家快递

对于各位商家来说拥有一个好的快递软件,能够有效的提高自己的工作效率,在管理快递单号的时候都需要对单号进行表格整理,那怎么样能够快速的查询所有单号信息,并自动生成表格呢?1、其实方法很简单,我们不需要一...

快递查询单号查询,怎么查物流到哪了

输入单号怎么查快递到哪里去了呢?今天小编给大家分享一个新的技巧,它支持多家快递,一次能查询多个单号物流,还可对查询到的物流进行分析、筛选以及导出,下面一起来试试。需要哪些工具?安装一个快递批量查询高手...

3分钟查询物流,教你一键批量查询全部物流信息

很多朋友在问,如何在短时间内把单号的物流信息查询出来,查询完成后筛选已签收件、筛选未签收件,今天小编就分享一款物流查询神器,感兴趣的朋友接着往下看。第一步,运行【快递批量查询高手】在主界面中点击【添...

快递单号查询,一次性查询全部物流信息

现在各种快递的查询方式,各有各的好,各有各的劣,总的来说,还是有比较方便的。今天小编就给大家分享一个新的技巧,支持多家快递,一次能查询多个单号的物流,还能对查询到的物流进行分析、筛选以及导出,下面一起...

快递查询工具,批量查询多个快递快递单号的物流状态、签收时间

最近有朋友在问,怎么快速查询单号的物流信息呢?除了官网,还有没有更简单的方法呢?小编的回答当然是有的,下面一起来看看。需要哪些工具?安装一个快递批量查询高手多个京东的快递单号怎么快速查询?进入快递批量...

快递查询软件,自动识别查询快递单号查询方法

当你拥有多个快递单号的时候,该如何快速查询物流信息?比如单号没有快递公司时,又该如何自动识别再去查询呢?不知道如何操作的宝贝们,下面随小编一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号若干...

教你怎样查询快递查询单号并保存物流信息

商家发货,快递揽收后,一般会直接手动复制到官网上一个个查询物流,那么久而久之,就会觉得查询变得特别繁琐,今天小编给大家分享一个新的技巧,下面一起来试试。教程之前,我们来预览一下用快递批量查询高手...

简单几步骤查询所有快递物流信息

在高峰期订单量大的时候,可能需要一双手当十双手去查询快递物流,但是由于逐一去查询,效率极低,追踪困难。那么今天小编给大家分享一个新的技巧,一次能查询多个快递单号的物流,下面一起来学习一下,希望能给大家...

物流单号查询,如何查询快递信息,按最后更新时间搜索需要的单号

最近有很多朋友在问,如何通过快递单号查询物流信息,并按最后更新时间搜索出需要的单号呢?下面随小编一起来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?运行【快递批量查询高手】...

连续保存新单号功能解析,导入单号查询并自动识别批量查快递信息

快递查询已经成为我们日常生活中不可或缺的一部分。然而,面对海量的快递单号,如何高效、准确地查询每一个快递的物流信息,成为了许多人头疼的问题。幸运的是,随着科技的进步,一款名为“快递批量查询高手”的软件...

快递查询教程,快递单号查询,筛选更新量为1的单号

最近有很多朋友在问,怎么快速查询快递单号的物流,并筛选出更新量为1的单号呢?今天小编给大家分享一个新方法,一起来试试吧。需要哪些工具?安装一个快递批量查询高手多个快递单号怎么快速查询?运行【快递批量查...

掌握批量查询快递动态的技巧,一键查找无信息记录的两种方法解析

在快节奏的商业环境中,高效的物流查询是确保业务顺畅运行的关键。作为快递查询达人,我深知时间的宝贵,因此,今天我将向大家介绍一款强大的工具——快递批量查询高手软件。这款软件能够帮助你批量查询快递动态,一...

从复杂到简单的单号查询,一键清除单号中的符号并批量查快递信息

在繁忙的商务与日常生活中,快递查询已成为不可或缺的一环。然而,面对海量的单号,逐一查询不仅耗时费力,还容易出错。现在,有了快递批量查询高手软件,一切变得简单明了。只需一键,即可搞定单号查询,一键处理单...

物流单号查询,在哪里查询快递

如果在快递单号多的情况,你还在一个个复制粘贴到官网上手动查询,是一件非常麻烦的事情。于是乎今天小编给大家分享一个新的技巧,下面一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号怎么快速查询?...

取消回复欢迎 发表评论: