C++ std::filesystem::perm_options

2025年3月21日 | 阅读 9 分钟

引言

在现代编程中使用 C++ 处理文件和目录时,可以完成许多操作,包括创建和销毁文件和目录,以及分别从文件和目录进行读写。然而,还有其他与这些基本操作同等重要的元素,即文件过程权限的分配,如果环境需要及时安全地访问文件,则此功能极为重要。这就是 C++17 及更高版本中的 <filesystem> 库的用武之地。

可以理解 <filesystem> 库是处理文件和目录的标准化视角的实现。该库有一个功能,用户可以更改设置在文件上的权限。UNIX 文件访问权限会调节用户对文件进行读取、写入、执行、剪切等操作的可访问性,在 Unix 环境中,这些权限由系统管理,而在其他 OS 中,应用程序需要这些权限,因此,管理这些权限对于任何应用程序都是强制性的。

在此库中,**std::filesystem::perm_options** 是一个枚举,可以在使用 std::filesystem::permissions 时确定如何强制执行权限更改。此函数可用于设置文件和目录的修改选项,而 perm_options 提供了决定文件和目录将如何更改的选项。学习 perm_options 以减少使用 C++ 编码的应用程序中的权限错误非常重要,因为它决定了应用程序中文件的访问权限。

为了充分理解 perm_options,有必要确保读者了解一些关于“文件权限”的重要概念。大多数操作系统中的文件权限是文件属性,用于回答用户或用户组对特定文件或目录允许执行哪些操作的问题。此类活动包括读取、写入和执行文件以及其他相关活动。

文件权限通常分为三类

  • 所有者权限: 文件所有者拥有的权限。
  • 组权限: 使用访问控制技术的文件组成员拥有的权限。
  • 其他用户权限: 所有其他用户拥有的权限。这些类别中的每一个都可以拥有以下权限
  • 读取 (r): 任何可以查看文件内容以进行分析的方式。
  • 写入 (w): 关于一个因素的意见,例如,修改文件内容的可能性。
  • 执行 (x): 在所讨论的文件上运行并将其作为程序执行的能力。

std::filesystem::perm_options 中的枚举值

std::filesystem::perm_options 是一个枚举,包含多个用于更改文件权限的选项。这些选项使人们能够定义权限的应用方式,从而在权限方面具有灵活性。该枚举包含以下值

  • Replace (替换): 此选项将现有权限替换为此处提供的权限。此选项在强制执行权限时非常有用,因为正如我们将看到的,使用此选项时,新权限将完全取代之前的权限。例如,如果您只设置了读写权限,那么使用替换实际上将删除首次授予的执行权限。
  • Add (添加): Add 选项在不更改任何未指定的其他权限的情况下,将新权限包含在其他权限中。当用户需要除了其帐户上现有权限之外的额外权限时,它非常有用。例如,当一个文件已经具有读写权限,而您使用 add 权限并指定执行权限时,您会发现该文件将具有读、写和执行权限。
  • Remove (移除): 此选项从当前设置的权限中移除指定的权限。当一个人想要取消一些已授予的权限而不影响其他权限时,这可能非常有帮助。例如,如果一个文件具有读、写和执行权限,但当使用 write 权限使用 remove 时,结果是任何可以访问该文件的人都只能读取甚至执行该文件。
  • Nofollow (不跟随): 如果文件或文件夹包含符号链接(也称为 symlink),则使用此选项。通常,所有在 symlink 上的文件操作都会影响链接的文件。但是,如果设置了 nofollow,则操作仅对 symlink 进行,而不对它指向的文件或目录进行。如果您希望更改 symlink 的权限而不过多地考虑目标文件/目录,这是一种不错的方式。

示例 1

让我们通过一个使用 C++ 中的 std::filesystem::perm_options 修改文件和符号链接权限的例子。

输出

 
Initial permissions: 
rw-r--r-- example.txt 
  
After replacing with owner read, write, and execute: 
rwx------ example.txt 
  
After adding group read and execute permissions: 
rwxr-x--- example.txt 
  
After removing owner write permissions: 
r-xr-x--- example.txt 
  
Initial symlink permissions: 
rwxr-x--- example_symlink 
  
After adding execute permissions to symlink without affecting the target: 
rwxr-x--x example_symlink    

示例 2

让我们再举一个使用 C++ 中的 std::filesystem::perm_options 来管理目录、文件和符号链接权限的例子。

输出

 
Initial directory permissions: 
rwxr-xr-x example_dir 
  
Initial file permissions: 
rw-r--r-- example_dir/example.txt 
  
After adding execute permission for others on the directory: 
rwxr-xr-x example_dir 
  
After removing all permissions for the group on file: 
rw----r-- example_dir/example.txt 
  
After replacing directory permissions with owner full access and others read-only: 
rwxr-xr-- example_dir 
  
After adding read permission for others on file: 
rw----r-- example_dir/example.txt 
  
Initial symlink permissions: 
rw----r-- example_dir/example_symlink 
  
After adding execute permissions to symlink without affecting the target: 
rw----r-x example_dir/example_symlink    

使用 C++ 中的 std::filesystem::perm_options 的优点

  1. 精细控制
    std::filesystem::perm_options 为文件和目录指定详细的权限,帮助开发人员根据需要管理权限。它使得能够使用 replace、add 和 remove 等选项进行精细设置权限,从而保护相关文件或目录,并使其只能被应用程序所有者授权访问的人访问。
  2. 跨平台兼容性
    <filesystem> 库(包括 perm_options)旨在跨平台独立,如下文所述。这意味着您可以在 LINUX 和 MAC OS 上编写代码来管理文件权限,而今天的好消息是 Windows 也允许开发人员编写可以轻松运行在这三个操作系统上的应用程序。
  3. 易用性
    perm_options 提供了一个相当友好且易于使用的界面。枚举值直观,开发人员可以在不详细了解平台 API 或权限管理系统的情况下定义权限更改。
  4. 安全增强
    文件权限对安全至关重要,perm_options 通过提供一种编程权限文件的方式来增强安全策略,以便添加、移除或设置权限。这有助于减少未经授权访问的可能性,这对您的应用程序的安全性是件好事,因为它们会变得更强大,更不容易受到某些攻击。
  5. 符号链接的灵活性
    nofollow 选项为符号链接提供了特殊处理,这样您就有机会更改链接条目的权限,而不是更改符号链接指向的文件。当需要单独管理符号链接的安全或行为时,这种灵活性尤其有用。

std::filesystem::perm_options 的缺点

  1. 仅限于 C++17 及更高版本
    std::filesystem::perm_options 仅在 C++17 及更高版本中可用。这使其无法在涉及早期 C++ 版本的旧项目中用作工具,因为它与这些版本不兼容。对于使用旧代码进行项目的开发人员来说,这意味着他们要么受限于使用特定于平台的 API,要么必须将代码重写为较新的 C++ 标准,这在大多数情况下可能无法实现。
  2. 潜在的错误
    perm_options 在权限管理方面具有很大的实用性,但如果使用不当,会导致完全访问。例如,在使用 replace 而不了解所有现有权限的情况下,可能会删除某些访问权限,这可能导致应用程序中的某些错误或一些安全问题。
  3. 平台特定行为
    跨平台设计并不意味着文件权限的行为是相同的,因为不同的操作系统工作方式不同。这也意味着在跨平台应用程序中,某些 perm_options 操作可能因平台而异,导致一些奇怪的行为。
  4. 复杂系统中的复杂性
    尽管 perm_options 对于权限级别较少的简单系统来说已经足够,但对于更复杂的系统来说可能不够。例如,管理更复杂的权限,例如 ACL 或任何其他更高级别的安全策略,可能需要与其他与平台集成的工具或 API 结合使用,而这些工具或 API 在 perm_options 中不可用。

结论

总之,**std::filesystem::perm_options** 是从 C++17 开始实现的一个便捷功能,它提供了操作文件和目录权限所需的工具。由于其灵活性、多语言支持、实现简单性、精细控制和数据访问保护,它是现代 C++ 编程中不可或缺的组件之一。然而,开发人员在使用时必须谨慎,因为它的使用可能导致各种问题,这些问题是由权限应用中的错误引起的,这些错误与 Android 平台的预期功能以及平台特定行为造成的复杂性有关。尽管存在这些挑战,std::filesystem::perm_options 对于高级用户来说是全面且通用的,对于其他类型的系统的主要用途也可能有用。随着 C++ 的不断发展,理解这个功能将更有效地提高开发人员在各种平台上创建更安全、更稳定的应用程序的技能。