使用 ofstream 打开文件时设置文件权限

Posted

技术标签:

【中文标题】使用 ofstream 打开文件时设置文件权限【英文标题】:Setting file permissions when opening a file with 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++ 中创建或读取目录的方法:) 【参考方案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 的示例。

【讨论】:

以上是关于使用 ofstream 打开文件时设置文件权限的主要内容,如果未能解决你的问题,请参考以下文章

std::ofstream 无法在 win7/64 和 msvc2013 上使用 std::ios::ate 打开大文件

C++中,ifstream和ofstream定义文件流的区别

C++文件读写详解(ofstream,ifstream,fstream)

文件流

Apache 说打开文件读取时出错:权限被拒绝

使用 std::string 打开文件