使用 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定义文件流的区别