Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用ofstream打开文件时设置文件权限_C++_Linux_File Permissions_Fstream - Fatal编程技术网

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

C++ 使用ofstream打开文件时设置文件权限,c++,linux,file-permissions,fstream,C++,Linux,File Permissions,Fstream,在C++的标准库(或linux sys/stat.h、sys/types.h、sys/…库)中是否有一种方法可以在使用流的创建文件时设置文件权限(或使用这些库中的其他内容) 当我创建一个文件时,它只是使用一些默认的文件权限集创建的(我假设当前的umask是什么),但是我想显式地将权限设置为默认权限以外的其他权限(例如600),并且我不能在启动程序之前只设置umask(b/c其他人将运行它) 在C++ C++程序中,有没有一种方法可以在C++程序中设置 UMASS>代码>? 例如,在C的标准库中,

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

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

<>在C++ C++程序中,有没有一种方法可以在C++程序中设置<代码> UMASS>代码>? 例如,在C的标准库中,您可以:

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


(旁注:有一位女士的名字正是我想要的,但事实证明与此无关。)

你不能。标准库必须与平台无关,例如,像
0600
这样的权限在Windows上是没有意义的。如果您想使用特定于平台的功能,则需要使用特定于平台的API。当然,在打开文件之前,您可以总是调用<代码> UMASK()/<代码>,但这不是C++标准库的一部分,它是平台API的一部分。
注意:
open()
也不是C标准库的一部分。这是一个平台API。打开文件的C标准库函数是
fopen()

在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):


示例基于.

不,C++没有意识到文件权限。(首先使用系统函数创建文件,然后打开C++流)你的意思是像使用C的
open
函数打开文件一样,关闭该文件描述符,然后使用流的
再次打开它吗?谁会猜到呢?在2015,我们终于意识到我们确实需要一种在C++中创建或读取目录的方法:)这是正确的,但是在文件系统中有一个TS,允许我们以可移植的方式来完成。TS在很多方面都很好,但是权限不是它擅长的事情(至少在非linux系统上是这样)。我还没有玩过它,所以我相信你的话。
open(filename, O_RDWR|O_CREAT, 0666)
using fs = std::filesystem;
bool owner_can_read =
    fs::status("my_file.txt").permissions() & fs::perms::owner_read != fs::perms::none;
using fs = std::filesystem;
fs::permissions("my_file.txt",
                fs::perms::owner_all | fs::perms::group_all,
                fs::perm_options::add);