Поделиться через


_sopen_s, _wsopen_s

Открывает файл для общего доступа. Эти версии и _wsopenимеют улучшения безопасности, как описано в функциях _sopen безопасности в CRT.

Синтаксис

errno_t _sopen_s(
   int* pfh,
   const char *filename,
   int oflag,
   int shflag,
   int pmode
);
errno_t _wsopen_s(
   int* pfh,
   const wchar_t *filename,
   int oflag,
   int shflag,
   int pmode,
);

Параметры

pfh
Дескриптор файла или -1, если возникает ошибка.

filename
Имя файла.

oflag
Разрешенные типы операций.

shflag
Разрешенные типы общего доступа.

pmode
Настройка разрешений.

Возвращаемое значение

Ненулевое возвращаемое значение указывает на ошибку; в этом случае для errno задается одно из следующих значений.

Значение errno Condition
EACCES Заданный путь является каталогом, или файл доступен только для чтения, однако была выполнена попытка операции открытия для записи.
EEXIST Указаны флаги _O_CREAT и _O_EXCL, однако filename уже существует.
EINVAL Недопустимый аргумент oflag, shflag или pmode, либо pfh или filename является пустым указателем.
EMFILE Больше нет доступных дескрипторов файлов.
ENOENT Файл или путь не найден.

Если недопустимый аргумент передается функции, вызывается обработчик недопустимых параметров, как описано в разделе "Проверка параметров". Если выполнение разрешено продолжать, errno задано EINVALзначение и EINVAL возвращается.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno, _doserrnoи _sys_nerr_sys_errlist.

Если возникает ошибка, функция -1 возвращается через pfh (если pfh не является пустым указателем).

Замечания

Функция _sopen_s открывает файл, указанный параметром filename, и готовит его к общему доступу для чтения или записи, как задано параметрами oflag и shflag. _wsopen_s — это версия _sopen_sс расширенными символами; аргумент filename для _wsopen_s — строка расширенных символов. Поведение_wsopen_s и _sopen_s идентично в противном случае.

По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить его, ознакомьтесь с глобальным состоянием в CRT.

Сопоставления подпрограмм универсального текста

Tchar.h рутина _UNICODE и _MBCS не определен _MBCS Определенные _UNICODE Определенные
_tsopen_s _sopen_s _sopen_s _wsopen_s

Целочисленное выражение oflag формируется путем объединения одной или нескольких констант манифеста, определенных в <fcntl.h>. Если две или более констант образуют аргумент oflag, они объединяются с побитовой оператором OR ( | ).

константа oflag; Поведение
_O_APPEND Перемещает указатель файла в конец файла перед каждой операцией записи.
_O_BINARY Открывает файл в двоичном режиме (без преобразования). (См fopen . описание двоичного режима.)
_O_CREAT Создает файл и открывает его для записи. Не действует, если существует файл, указанный параметром filename. Аргумент pmode обязателен, если указан флаг _O_CREAT.
_O_CREAT | _O_SHORT_LIVED Создает файл как временный и, если это возможно, не сбрасывает на диск. Аргумент pmode обязателен, если указан флаг _O_CREAT.
_O_CREAT | _O_TEMPORARY Создает файл в качестве временного файла; файл удаляется при закрытии последнего дескриптора файла. Аргумент pmode обязателен, если указан флаг _O_CREAT. Чтобы сохранить устаревшее поведение для совместимости приложений, другие процессы не препятствуют удалению этого файла.
_O_CREAT | _O_EXCL Возвращает значение ошибки, если файл, указанный параметром filename, существует. Применяется только при использовании с _O_CREAT.
_O_NOINHERIT Предотвращает создание общего дескриптора файла.
_O_RANDOM Указывает, что кэширование оптимизировано для случайного доступа с диска, но не ограничивается им.
_O_RDONLY Открывает файл только для чтения. Не удается указать или _O_RDWR _O_WRONLY.
_O_RDWR Открывает файл для чтения и записи. Не удается указать или _O_RDONLY _O_WRONLY.
_O_SEQUENTIAL Указывает, что кэширование оптимизировано для последовательного доступа с диска, но не ограничивается им.
_O_TEXT Открывает файл в режиме перевода текста ANSI. (Дополнительные сведения см. в разделе Текстовый и двоичный режим операций ввода-вывода и fopen.)
_O_TRUNC Открывает файл и обрезает его до нулевой длины; необходимо разрешение на запись в файл. Не удается указать с _O_RDONLYпомощью . _O_TRUNC при использовании с _O_CREAT открывает существующий файл или создает новый. Примечание. Флаг _O_TRUNC уничтожает содержимое указанного файла.
_O_WRONLY Открывает файл только для записи. Не удается указать или _O_RDONLY _O_RDWR.
_O_U16TEXT Открывает файл в режиме Юникода UTF-16.
_O_U8TEXT Открывает файл в режиме Юникода UTF-8.
_O_WTEXT Открывает файл в режиме Юникода.

Чтобы указать режим доступа к файлу, необходимо задать _O_RDONLY, _O_RDWR или _O_WRONLY. Значение по умолчанию для режима доступа отсутствует.

Если файл открывается в режиме Юникода с помощью флагов _O_WTEXT, _O_U8TEXT или _O_U16TEXT, функции ввода преобразуют данные, считываемые из файла в данные UTF-16, хранимые с типом wchar_t. Затем функции, которые выполняют запись в файл, открытый в режиме Юникода, ожидают буферы, содержащие данные UTF-16, хранимые с типом wchar_t. Если файл закодирован как UTF-8, данные UTF-16 превратятся в UTF-8 при записи. Содержимое в кодировке UTF-8 преобразуется в UTF-16 при чтении. Попытка чтения или записи нечетного числа байт в режиме Юникода приводит к возникновению ошибки проверки параметра . Для чтения или записи данных, хранимых в программе в кодировке UTF-8, используйте режим текстового или двоичного файла вместо режима Юникода. Вы несете ответственность за любой необходимый перевод кодировки.

Если _sopen_s вызывается с флагами _O_WRONLY | _O_APPEND (режим добавления) и _O_WTEXT, _O_U16TEXT или _O_U8TEXT, сначала выполняется попытка открыть файл для чтения и записи, считывается метка порядка байтов, а затем файл снова открывается только для записи. Если происходит сбой открытия файла для чтения и записи, файл открывается только для записи и для параметра режима Юникода используется значение по умолчанию.

Аргумент shflag — это константное выражение, состоящее из одной из следующих констант манифеста, определенных в <share.h>.

константа shflag; Поведение
_SH_DENYRW Запрещает доступ на чтение и запись.
_SH_DENYWR Запрещает доступ на запись.
_SH_DENYRD Запрещает доступ на чтение.
_SH_DENYNO Разрешает доступ на чтение и запись.

Аргумент pmode всегда обязателен, в отличие от _sopen. _O_CREATЕсли файл не существует, указывает параметры разрешений файла, pmode которые задаются при первом закрытии нового файла. В противном случае pmode игнорируется. pmode представляет собой целочисленное выражение, содержащее одну или обе константы манифеста _S_IWRITE и _S_IREADопределенные в <sys\stat.h>. При указании обеих констант они объединяются с побитовой оператором OR. Значение параметра pmode следующее.

pmode Значение
_S_IREAD Разрешено только чтение.
_S_IWRITE Разрешена запись. (Если действует, разрешает чтение и запись.)
_S_IREAD | _S_IWRITE Разрешены чтение и запись.

Если разрешение на запись не задано, файл доступен только для чтения. В операционной системе Windows все файлы доступны для чтения; Невозможно предоставить разрешение только для записи. Поэтому режимы _S_IWRITE и _S_IREAD | _S_IWRITE эквивалентны.

_sopen_s применяет текущую маску разрешений файла к pmode до настройки разрешений. (См. раздел _umask.)

Требования

Function Обязательный заголовок Необязательный заголовок
_sopen_s <io.h> <fcntl.h>, , <sys\types.h><sys\stat.h><share.h>
_wsopen_s <io.h> или <wchar.h> <fcntl.h>, , <sys/types.h><sys/stat.h><share.h>

_sopen_s и _wsopen_s являются расширениями Майкрософт. Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример

Пример см. в примере _locking.

См. также

Низкоуровневый ввод-вывод
_close
_creat, _wcreat
fopen, _wfopen
_fsopen, _wfsopen
_open, _wopen