C++20 中的文件模式

主要观点:通过调用chmod(2)设置文件权限(文件模式),chmod(1)命令行有多种设置权限的方式,但底层系统调用需要int,C 头文件使用起来较麻烦,于是用 C++机制使其更易用。

关键信息:

  • chmod的 C 接口需路径名和模式,有符号常量如S_IRUSR等。
  • 常以八进制思考文件模式,如“755 用于可执行文件”等,但 C 源中八进制形式较繁琐。
  • ls -l输出的文件权限用 10 个字符表示,前 9 个字符分别表示当前用户、组、其他用户的读、写、执行权限。
  • 编写 C++函数将文本形式的 9 字符模式转换为mode_t值,还可写成consteval函数在编译时计算,进而将其变成用户定义字面量,如chmod("example.txt", "rw-r--r--"_mode)
  • 在 Qt 中,QFileDevice::Permission的值是十六进制但看起来像八进制,导致更易混淆。
  • 通过模板和类型命名可改善现有错误消息,如在 C++中使用合适的模板函数可明确指出错误位置和字符。

重要细节:

  • 定义用户定义字面量_mode的函数,检查字符串长度是否为 9,否则抛出异常。
  • 实现将字符串转换为mode_t的函数,通过多个expected_character_at_position模板函数检查每个位置的字符是否符合要求,不符合则抛出异常。
  • 不同编译器(如 Clang 17、GCC 13)的错误消息形式类似,都能指出错误位置和字符。
  • 代码可在个人 GitHub 仓库的playground子目录mode/中找到。
阅读 4
0 条评论