Как установить права доступа к файлу при открытии файла в C ++? - PullRequest
2 голосов
/ 08 июня 2011

В 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 ]

7 голосов
/ 08 июня 2011

Опция, которую вы, похоже, хотите указать (O_RDONLY) - это не «разрешение», это режим доступа.Они устанавливаются неявно в соответствии с комбинациями std::ios_base::in и std::ios_base::out: in только приводит к O_RDONLY, out только в O_WRONLY и in | out в O_RDWR.

Для разрешений для созданного файла ответ довольно досадный: их нельзя указать.std::filebuf::open() (это то, что в конечном итоге вызывают std::ifstream и std::ofstream) не имеет опций или положений для передачи каких-либо указаний разрешений, которые будут использоваться, если он должен создать файл.
Единственный способ сделать это -используя функции системного уровня (open в Linux, CreateFile в Windows - несмотря на имена, open может создать файл, а CreateFile откроет существующий файл, ничего не создавая).Использование системного уровня open / CreateFile означает использование системного уровня read / ReadFile и write / WriteFile.

.
4 голосов
/ 08 июня 2011

Для 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). Посмотрите на это для более подробной информации.

2 голосов
/ 08 июня 2011

Если вы работаете в Unix-системах, вам нужна функция "setmode" или "getmode".

В командной строке вашей оболочки введите "man setmode"

1 голос
/ 08 июня 2011
  1. Второй аргумент fstream :: open - это комбинация флагов, выбранных в ios :: app, ios :: binary, ios :: ate, ios :: in, ios :: out, ios:: trunc.

  2. Нет стандартного интерфейса C ++ для установки прав доступа.Известные мне реализации используют 0666, который затем маскируется значением, установленным umask (2).Это также обычное поведение Unix-приложений (umask наследуется от родителя, а оболочки имеют встроенную команду umask).Я рекомендую, чтобы вы ничего не делали и полагались на umask, установленный пользователем.Если это не применимо, временно измените umask в своем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...