MySQL 在不同 OS 使用標準 C 庫函數(open/close/seek/read/write)與 Win32 API(CreateFile/CloseHandle/SetFilePointer/ReadFile/WriteFile)。兩套均可建立文字/二進制檔案,功能對應:
| C 庫 | Win32 API |
|---|---|
read() | ReadFile() |
write() | WriteFile() |
seek() | SetFilePointer() |
close() | CloseHandle() |
Win32 將「文件」概念擴展:通訊設備、命名管道、郵件槽、磁碟、控制台,皆用 CreateFile 開啟/建立。
HANDLE CreateFile( LPCTSTR lpFileName, // 檔名 DWORD dwDesiredAccess, // 存取模式 DWORD dwShareMode, // 共享模式 LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 通常 NULL DWORD dwCreationDistribution, // 建立方式 DWORD dwFlagsAndAttributes, // 屬性與標誌 HANDLE hTemplateFile // 臨時檔句柄,通常 NULL );
成功返回檔案句柄,失敗返回 INVALID_HANDLE_VALUE。
FILE_FLAG_OVERLAPPED。函數阻塞直到操作完成,執行緒等待,效率低。CreateFile 指定 FILE_FLAG_OVERLAPPED。ReadFile/WriteFile 立即返回,耗時 I/O 在後台進行,執行緒可處理其他任務,**大幅提升效率**。此異步機制值得我們在自身文件操作封裝中借鑑,透過平台相關封裝提升 I/O 效能。