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


_sopen_s, _wsopen_s

Открывает файл для общего доступа. Эти версии _sopen and _wsopen включают усовершенствования безопасности, как описано в разделе Функции безопасности в 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 задается одно из следующих значений.

  • EACCES
    Заданный путь является каталогом, или файл доступен только для чтения, однако была выполнена попытка операции открытия для записи.

  • EEXIST
    Указаны флаги _O_CREAT и _O_EXCL, однако filename уже существует.

  • EINVAL
    Недопустимый аргумент oflag, shflag или pmode, либо pfh или filename является пустым указателем.

  • EMFILE
    Больше нет доступных дескрипторов файлов.

  • ENOENT
    Файл или путь не найден.

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

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

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

Заметки

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

Универсальное текстовое сопоставление функций

Процедура Tchar.h

_UNICODE и _MBCS не определены

_MBCS определено

_UNICODE определено

_tsopen_s

_sopen_s

_sopen_s

_wsopen_s

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

  • _O_APPEND
    Перемещает указатель файла в конец файла перед каждой операцией записи.

  • _O_BINARY
    Открывает файл в двоичном режиме (без преобразования). (Описание двоичного режима см. в разделе fopen.)

  • _O_CREAT
    Создает файл и открывает его для записи. Не действует, если существует файл, указанный параметром filename.

  • _O_CREAT | _O_SHORT_LIVED
    Создает файл в качестве временного файла и, по возможности, не сбрасывает его на диск.

  • _O_CREAT | _O_TEMPORARY
    Создает файл в качестве временного файла; файл удаляется при закрытии последнего дескриптора файла.

  • _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
    Открывает файл в текстовом режиме (с преобразованием). (Дополнительные сведения см. в разделах Ввод и вывод файлов в текстовом и двоичном режиме и 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>.

  • _SH_DENYRW
    Запрещает доступ на чтение и запись.

  • _SH_DENYWR
    Запрещает доступ на запись.

  • _SH_DENYRD
    Запрещает доступ на чтение.

  • _SH_DENYNO
    Разрешает доступ на чтение и запись.

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

  • _S_IWRITE
    Разрешена запись.

  • _S_IREAD
    Разрешено чтение.

  • _S_IREAD | _S_IWRITE
    Разрешены чтение и запись.

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

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

Требования

Подпрограмма

Обязательный заголовок

Необязательный заголовок

_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