How do I set file permissions when opening a file in C++?
In C++, I want to open a file and set its permission, but I failed. Below is my program:
string filename=开发者_运维百科"test.cnf";
ofstream ofile;
ofile.open(filename.c_str(),O_RDONLY);
ofile.close()
But I get the following error:
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>]'
How to set the permission of the file to such as 644, 700?
The option you seem to want to specify (O_RDONLY
) isn't a
"permission", it's an access mode. These are set implicitly according
to the combinations of std::ios_base::in
and std::ios_base::out
:
in
alone results in O_RDONLY
, out
alone in O_WRONLY
and in |
out
in O_RDWR
.
For the permissions on a created file, the answer is, rather annoyingly,
thet you can't specify them. std::filebuf::open()
(which is what
std::ifstream
and std::ofstream
ultimately call) has no options or
provisions for passing in any indication of permissions to be used if it
must create the file.
The only way to do this is by using your system level functions (open
under Linux, CreateFile
under Windows—despite the names, open
may create a file, and CreateFile
will open an existing file, without
creating anything). Using system level open
/CreateFile
, however,
means using system level read
/ReadFile
and write
/WriteFile
.
There is not O_RDONLY
mode for fstream
. You should use one of:
ios::app
ios::binary
ios::ate
ios::in
ios::out
ios::trunc
Or their combinations (say ios::app | ios::binary
). For your case you should use ios::in
(maybe with ios::binary
). Look at this for more details.
If you are on unix systems, what you need is the "setmode" or "getmode" function.
From your shell command-line, type "man setmode"
The second argument of fstream::open is a combination of flags chosen in ios::app, ios::binary, ios::ate, ios::in, ios::out, ios::trunc.
There is no standard C++ interface to set the access right. The implementations I know are using 0666 which is then masked by the value set by umask(2). This is also the usual behavior of unix applications (the umask is inherited from the parent and shells have a builtin umask command). My recommandation is that you do nothing and rely on the umask set by the user. If that is not applicable, temporarily change the umask in your app.
精彩评论