【问题标题】:How do I set file permissions when opening a file in C++?在 C++ 中打开文件时如何设置文件权限?
【发布时间】:2011-09-10 14:27:38
【问题描述】:

在 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等?

【问题讨论】:

    标签: c++ unix file-io


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

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

    【讨论】:

      【解决方案2】:

      您似乎想要指定的选项 (O_RDONLY) 不是 “权限”,是一种访问方式。这些是根据隐式设置的 std::ios_base::instd::ios_base::out 的组合: in 单独导致 O_RDONLYout 单独在 O_WRONLYin | outO_RDWR

      对于创建的文件的权限,答案是相当烦人的, 你不能指定它们。 std::filebuf::open()(这是什么 std::ifstreamstd::ofstream 最终调用)没有选择或 规定传递任何许可使用的指示,如果它 必须创建文件。
      做到这一点的唯一方法是使用您的系统级函数 (open 在 Linux 下,CreateFile 在 Windows 下——尽管有名称,open 可以创建一个文件,CreateFile 将打开一个现有文件,而不 创造任何东西)。但是,使用系统级别 open/CreateFile, 表示使用系统级read/ReadFilewrite/WriteFile

      【讨论】:

      • 感谢您的回答,很有帮助。但是我必须选择第一个人作为接受者,因为他很快。对不起:-)
      • @zhaojing 你应该选择最正确/最好的答案来接受。哪个先来并不重要
      【解决方案3】:

      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)。查看this了解更多详情。

      【讨论】:

      • 非常感谢您的快速回复。这对我弄清楚我的错误非常有帮助。
      • 这里只处理第一部分
      • 这并没有说明分配给文件的权限,也没什么帮助。
      【解决方案4】:

      如果您使用的是 unix 系统,您需要的是“setmode”或“getmode”函数。

      在你的 shell 命令行中,输入“man setmode”

      【讨论】:

      • 我认为setmodegetmode 与OP 的问题没有任何关系。
      • 同意@Billy。 @malkia OP 对 std::ofstream 有问题,但你告诉他如果是关于 FILE* 的问题如何解决。
      • 谢谢大家!是的,我的问题与 std:ofstream 有关。但是你的方法给了我另一种方法,谢谢!
      猜你喜欢
      • 2016-02-06
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      相关资源
      最近更新 更多