Share via


_sopen_s, _wsopen_s

開啟檔案以供共用。 這些版本的 _sopen_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 會設為下列其中一個值。

errno Condition
EACCES 指定的路徑為目錄,或是檔案為唯讀,但已嘗試「開啟以供寫入」作業。
EEXIST 指定了 _O_CREAT_O_EXCL 旗標,但 filename 已存在。
EINVAL 無效的 oflagshflagpmode 引數,或者 pfhfilename 為 null 指標。
EMFILE 沒有更多可用的檔案描述元。
ENOENT 找不到檔案或路徑。

如果將無效的自變數傳遞至函式,則會叫用無效的參數處理程式,如參數驗證中所述。 如果允許繼續執行, errno 則會設定為 EINVAL,並 EINVAL 傳回 。

如需這些傳回碼和其他傳回碼的詳細資訊,請參閱errno_sys_errlist_doserrno_sys_nerr

如果發生錯誤,則會透過 pfh 傳回 -1 (除非 pfh 是 Null 指標)。

備註

_sopen_s 函式會開啟 filename 指定的檔案,並準備檔案,以供共用讀取或寫入 (由 oflagshflag 指定)。 _wsopen_s 是寬字元版本的 _sopen_sfilename_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_WRONLY指定 _O_RDWR
_O_RDWR 開啟檔案以進行讀取和寫入。 無法使用 或 _O_WRONLY指定 _O_RDONLY
_O_SEQUENTIAL 指定針對但不限於磁碟的循序存取進行快取最佳化。
_O_TEXT 以 ANSI 文字 (翻譯) 模式開啟檔案。 (如需詳細資訊,請參閱 文字和二進位模式檔案 I/Ofopen。)
_O_TRUNC 開啟檔案,並將檔案截斷為零長度;檔案必須具有寫入權限。 無法使用 指定 。 _O_RDONLY _O_TRUNC 用於搭配 _O_CREAT 以開啟現有檔案或建立檔案。 注意: 旗標會 _O_TRUNC 終結指定檔案的內容。
_O_WRONLY 將檔案開啟為僅供寫入。 無法使用 或 _O_RDWR指定 _O_RDONLY
_O_U16TEXT 以 Unicode UTF-16 模式開啟檔案。
_O_U8TEXT 以 Unicode UTF-8 模式開啟檔案。
_O_WTEXT 以 Unicode 模式開啟檔案。

若要指定檔案存取模式,您必須指定 _O_RDONLY_O_RDWR_O_WRONLY。 存取模式沒有預設值。

使用 _O_WTEXT_O_U8TEXT_O_U16TEXT 以 Unicode 模式開啟檔案時,請輸入函式,將從檔案讀取的資料,轉譯為儲存為類型 wchar_t 的 UTF-16 資料。 寫入檔案的函式會以 Unicode 模式開啟,但包含儲存為類型 wchar_t之 UTF-16 資料的緩衝區除外。 如果檔案編碼為UTF-8,則寫入UTF-8時,UTF-16數據會轉譯為UTF-8。 檔案的UTF-8編碼內容會在讀取時轉譯為UTF-16。 嘗試以 Unicode 模式讀取或寫入奇數位元組會導致 參數驗證 錯誤。 若要讀取或寫入作為 UTF-8 儲存在您程式裡的資料時,請使用文字或二進位檔案模式,不要使用 Unicode 模式。 您必須負責任何必要的編碼轉譯。

若搭配 _sopen_s (附加模式) 及 _O_WRONLY | _O_APPEND_O_WTEXT_O_U16TEXT 呼叫 _O_U8TEXT,會先嘗試開啟檔案以供讀取和寫入,再讀取 BOM,然後重新開啟檔案且僅供寫入。 若開啟檔案以供讀取和寫入失敗,則會僅針對寫入開啟檔案,並使用 Unicode 模式設定的預設值。

自變數 shflag 是包含下列其中一個指令清單常數的常數表達式,定義於 中 <share.h>

shflag 常數 行為
_SH_DENYRW 拒絕對檔案的讀取和寫入存取。
_SH_DENYWR 拒絕對檔案的寫入存取。
_SH_DENYRD 拒絕對檔案的讀取存取。
_SH_DENYNO 允許讀取及寫入權限。

與在 pmode 中不同,_sopen 引數一定是需要的。 當您指定 _O_CREAT時,如果檔案不存在, pmode 請指定檔案的許可權設定,這是在第一次關閉新檔案時設定的。 否則會忽略 pmodepmode是整數表達式,其中包含一個或兩個指令清單常數和 _S_IREAD,這些常數_S_IWRITE定義於 中<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.)

需求

函式 必要的標頭 選擇性標頭
_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 是 Microsoft 擴充功能。 如需相容性詳細資訊,請參閱相容性

範例

請參閱 _locking 的範例。

另請參閱

低階 I/O
_close
_creat, _wcreat
fopen, _wfopen
_fsopen, _wfsopen
_open, _wopen