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

xgo*_*ord 5 c++ linux file-permissions fstream

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

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

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

/* write something to it */
Run Code Online (Sandbox Code Playgroud)

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

例如,在C的标准库中,您可以这样做:

open(filename, O_RDWR|O_CREAT, 0666)
Run Code Online (Sandbox Code Playgroud)

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

(旁注:有一个问题,其标题正是我所寻找的,但事实证明它是无关的.)

Mil*_*nek 7

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

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


Tom*_*Tom 6

在 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;
Run Code Online (Sandbox Code Playgroud)

设置权限(添加owner和group的所有权限,即在unix上添加modes 0x770):

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

基于cppreference示例的示例。