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

9

在C++标准库中(或linux sys/stat.h,sys/types.h,sys/....库)有没有一种方法可以在使用ofstream创建文件时设置文件权限(或使用这些库中的其他内容)?

当我创建一个文件时,它只会被创建为某个默认的文件权限集(我假设是当前的umask),但我想明确地将权限设置为与默认值不同的某些值(例如600),而且我不能仅在开始程序之前设置umask(因为其他人也会运行它)。

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

/* write something to it */

有没有一种方法可以在C++中实现这个功能,或者如果不行,是否有一种方法在C++程序中设置umask

例如,在C的标准库中,您只需执行

open(filename, O_RDWR|O_CREAT, 0666)

但我不想使用C函数,因为能够使用与fstream对象相关的函数会更好。

(附注:有一个问题的标题正是我要找的,但结果发现与此无关。)


1
不,C++不知道文件权限。(首先使用系统函数创建文件,然后打开C++流) - user2249683
дҪ зҡ„ж„ҸжҖқжҳҜдҪҝз”ЁCиҜӯиЁҖзҡ„openеҮҪж•°жү“ејҖж–Ү件пјҢе…ій—ӯиҜҘж–Ү件жҸҸиҝ°з¬ҰпјҢ然еҗҺеҶҚдҪҝз”ЁofstreamйҮҚж–°жү“ејҖе®ғеҗ—пјҹ - xgord
这里有一个实验性的文件系统库TS - NathanOliver
2
@NathanOliver,谁能想到呢?在2015年,我们终于意识到我们确实需要一种在C++中创建或读取目录的方法 :) - SergeyA
2个回答

9
在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 的示例。


8
无法做到。标准库必须是跨平台的,例如在Windows上权限为0600是没有意义的。如果您想使用平台特定的功能,则需要使用平台特定的API。当然,在打开文件之前,您可以始终调用umask(),但这不是C++标准库的一部分,而是平台API的一部分。
注意:open()也不是C标准库的一部分,它是平台API。C标准库函数打开文件的方法是fopen()。

目前这是正确的,但是有一个文件系统的 TS 可以让我们实现可移植性。文件系统库 TS - NathanOliver
TS 在很多方面都非常出色,但权限并不是它擅长的领域(至少在非 Linux 系统上)。 - Miles Budnek
我还没有使用过它,所以我会相信你的话。 - NathanOliver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接