【问题标题】:Setting file permissions when opening a file with ofstream使用 ofstream 打开文件时设置文件权限
【发布时间】:2016-02-06 17:40:54
【问题描述】:

在 C++ 的标准库(或 linux sys/stat.h、sys/types.h、sys/....或使用这些库中的其他东西)?

当我创建一个文件时,它只是使用一些默认的文件权限集创建的(我假设当前umask 是什么),但我想明确地将权限设置为默认值以外的其他权限(例如@987654326 @),我不能在启动程序之前设置 umask(b/c 其他人会运行它)。

// Example of creating a file by writing to it
ofstream fp(filename.c_str())

/* write something to it */

有没有办法在 C++ 中执行此操作,或者如果没有,可以在 C++ 程序中设置 umask 吗?

例如,在 C 的标准库中你 can just do:

open(filename, O_RDWR|O_CREAT, 0666)

但我不想求助于使用 C 函数,因为能够使用与 fstream 对象关联的函数会很好。

旁注:有一个question,它的标题正是我要找的,但结果却不相关。

【问题讨论】:

  • 不,C++ 不知道文件权限。 (首先使用系统函数创建文件,然后打开 C++ 流)
  • 你的意思是像使用 C 的 open 函数打开文件,关闭该文件描述符,然后使用 ofstream 再次打开它?
  • 有实验的Filesystem library TS
  • @NathanOliver,谁能猜到?在 2015 年,我们终于意识到我们确实需要一种在 C++ 中创建或读取目录的方法:)

标签: c++ linux file-permissions fstream


【解决方案1】:

你不能。标准库必须与平台无关,例如,0600 之类的权限在 Windows 上毫无意义。如果要使用特定于平台的功能,则需要使用特定于平台的 API。当然,您始终可以在打开文件之前调用umask(),但这不是 C++ 标准库的一部分,而是平台 API 的一部分。

注意:open() 也不是 C 标准库的一部分。这是一个平台API。打开文件的C标准库函数是fopen()

【讨论】:

  • 现在确实如此,但有一个文件系统的 TS 可以让我们以便携的方式执行此操作。 Filesystem library TS
  • TS 在很多事情上都很棒,但权限并不是它擅长的事情(至少在非 Linux 系统上)。
  • 我还没有玩过,所以我相信你的话。
【解决方案2】:

在 C++17 中,引入了std::filesystem::permissions。它将使您能够以与平台无关的方式获取和设置权限。

获取权限:

using fs = std::filesystem;
bool owner_can_read =
    fs::status("my_file.txt").permissions() & fs::perms::owner_read != fs::perms::none;

设置权限(添加所有者和组的所有权限,即在unix上添加模式0x770):

using fs = std::filesystem;
fs::permissions("my_file.txt",
                fs::perms::owner_all | fs::perms::group_all,
                fs::perm_options::add);

示例基于来自cppreference 的示例。

【讨论】:

    猜你喜欢
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 2014-04-28
    • 2013-01-12
    • 1970-01-01
    • 2015-10-18
    • 2012-01-20
    相关资源
    最近更新 更多