2011-06-08 142 views
2

在C++中,我想打开一个文件并设置其权限,但是失败了。下面是我的程序:如何在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的许可?

回答

4

fstream没有O_RDONLY模式。您应该使用的一个:

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

或其combinati (例如ios::app | ios::binary)。对于你的情况,你应该使用ios::in(也许与ios::binary)。查看this了解更多详情。

+0

非常感谢您的快速回复。这对我清除我的错误非常有帮助。 – zhaojing 2011-06-08 09:18:08

+0

这只能处理第一部分 – UpAndAdam 2013-10-17 19:34:14

+0

这并没有说明分配给文件的权限,也没有什么帮助。 – 2016-08-04 17:30:14

2

如果你在unix系统上,你需要的是“setmode”或“getmode”函数。

从你的shell命令行中键入“人setmode”

+1

我不认为'setmode'或'getmode'与OP的问题有什么关系。 – 2011-06-08 05:57:22

+0

同意@Billy。 @malkia OP有'std :: ofstream'的问题,但你告诉他如何解决这个问题,如果它是关于'FILE *'的。 – 2011-06-08 06:54:05

+0

谢谢大家!是的,我的问题与std:ofstream有关。但你的方法给我另一种方式,谢谢! – zhaojing 2011-06-08 09:19:29

7

你似乎要指定(O_RDONLY)的选项不是 “许可”,这是一个访问模式。在O_WRONLYO_RDWRin | out in单独导致O_RDONLYout单独:这些是根据 到的std::ios_base::instd::ios_base::out组合设置隐式。

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

+0

感谢您的回答,这很有帮助。但我必须选择第一个人作为接受人,因为他很快。对不起:-) – zhaojing 2011-06-08 09:32:01

+0

@赵靖你应该选择接受的答案是最正确的/是最好的答案。不要紧,哪一个先到先得 – UpAndAdam 2013-10-17 19:36:02

1
  1. fstream的::开放的第二个参数是在IOS ::应用程序,IOS ::二进制,IOS ::选择标志的组合吃,IOS ::在,IOS ::出来,IOS :: TRUNC。

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

+0

谢谢你的不错答案,这让我很清楚! – zhaojing 2011-06-08 09:30:25