如何在C++中打开文件时设置文件权限

How do I set file permissions when opening a file in C++?

本文关键字:文件 设置 权限 C++      更新时间:2023-10-16

在C++中,我想打开一个文件并设置其权限,但我失败了。以下是我的程序:

string filename="test.cnf";
ofstream ofile;
ofile.open(filename.c_str(),O_RDONLY);
ofile.close()

但是我收到以下错误:

error: invalid conversion from 'int' to 'std::_Ios_Openmode'
error:   initializing argument 2 of 'void std::basic_ofstream<_CharT, _Traits>::open(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]'

如何将文件的权限设置为644,700?

您似乎想要指定的选项(O_RDONLY(不是"权限",这是一种访问模式。 这些是隐式设置的对于std::ios_base::instd::ios_base::out的组合: 单独in导致O_RDONLYout单独导致O_WRONLYin | out O_RDWR

对于创建文件的权限,答案是,相当烦人,您无法指定它们。 std::filebuf::open()(这就是 std::ifstreamstd::ofstream最终调用(没有选择或规定在以下情况下传递要使用的任何权限指示必须创建文件。
执行此操作的唯一方法是使用系统级函数(open在 Linux 下,CreateFile 在 Windows 下——尽管有名字,open可以创建一个文件,CreateFile将打开一个现有文件,没有创建任何内容(。 但是,使用系统级open/CreateFile ,表示使用系统级read/ReadFilewrite/WriteFile

fstream没有O_RDONLY模式。您应该使用以下之一:

  1. ios::app
  2. ios::binary
  3. ios::ate
  4. ios::in
  5. ios::out
  6. ios::trunc

或者它们的组合(比如ios::app | ios::binary(。对于您的情况,您应该使用ios::in(可能带有ios::binary(。查看此内容以获取更多详细信息。

如果你在Unix系统上,你需要的是"setmode"或"getmode"函数。

从你的 shell 命令行中,键入"man setmode">

    fstream::open 的第二个参数是在 ios::app、ios::binary、ios::ate、ios::
  1. in、ios::out、ios::trunc 中选择的标志的组合。

  2. 没有标准的C++接口来设置访问权限。 我知道的实现使用的是 0666,然后被 umask(2( 设置的值屏蔽。这也是 unix 应用程序的通常行为(掩码继承自父级,shell 具有内置的掩码命令(。 我的建议是,你什么都不做,依赖于用户设置的掩码。如果这不适用,请暂时更改应用中的掩码。