複製鏈接
請複製以下鏈接發送給好友

CreateFile

鎖定
這是一個多功能的函數,可打開或創建文件或者I/O設備,並返回可訪問的句柄:控制枱,通信資源,目錄(只讀打開),磁盤驅動器,文件,郵槽,管道。
中文名
CreateFile
釋    義
多功能的函數
對    象
控制枱,通信資源,目錄
包    括
返回值

CreateFile函數原型

HANDLE WINAPI CreateFile(
_In_ LPCTSTR lpFileName,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_ DWORD dwCreationDisposition,
_In_ DWORD dwFlagsAndAttributes,
_In_opt_ HANDLE hTemplateFile
);

CreateFile返回值

Long,如執行成功,則返回文件句柄。INVALID_HANDLE_VALUE表示出錯,會設置GetLastError。即使函數成功,但若文件存在,且指定了CREATE_ALWAYS 或 OPEN_ALWAYS,GetLastError也會設為ERROR_ALREADY_EXISTS

CreateFile函數聲明

HANDLE CreateFile(LPCTSTR lpFileName, //普通文件名或者設備文件名
DWORD dwDesiredAccess, //訪問模式(寫/讀)
DWORD dwShareMode, //共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全屬性的指針
DWORD dwCreationDisposition, //如何創建
DWORD dwFlagsAndAttributes, //文件屬性
HANDLE hTemplateFile //用於複製文件句柄
);

CreateFile參數説明

lpFileName String要打開的文件的名或設備名。這個字符串的最大長度在ANSI版本中為MAX_PATH,在unicode版本中為32767。
dwDesiredAccess指定類型的訪問對象。如果為 GENERIC_READ 表示允許對設備進行讀訪問;如果為 GENERIC_WRITE 表示允許對設備進行寫訪問(可組合使用);如果為零,表示只允許獲取與一個設備有關的信息 。
另外,還可以指定下面的控制標誌:
標準控制權限(16-23位掩碼):
DELETE 刪除對象的權限。
READ_CONTROL 從對象的安全描述符中讀取信息的權限,但不包括SACL(系統訪問控制列表)中的信息。
WRITE_DAC 修改對象安全描述符中的DACL(隨機訪問控制列表)的權限
WRITE_OWNER 修改對象安全描述符中的屬主的權限
SYNCHRONIZE 同步化使用對象的權限,即可以創建一個線程等待信號量釋放(但有些對象不支持這個權限)。
STANDARD_RIGHTS_REQUIRED 等價於前面四種權限的總合(通常這四種是必須具有的權限)。
STANDARD_RIGHTS_READ 一般等價於READ_CONTROL
STANDARD_RIGHTS_WRITE 一般等價於READ_CONTROL
STANDARD_RIGHTS_EXECUTE 一般等價於READ_CONTROL
STANDARD_RIGHTS_ALL 等價於前面五種權限的總合。
特殊控制權限(0-15位掩碼):
SPECIFIC_RIGHTS_ALL
ACCESS_SYSTEM_SECURITY
MAXIMUM_ALLOWED
GENERIC_READ
GENERIC_WRITE
GENERIC_EXECUTE
GENERIC_ALL
注:實質上是通過ACCESS_MASK結構體的一個雙字值來設置標準權限、特殊權限和一般權限的。
dwShareModeLong, 如果是零表示不共享; 如果是FILE_SHARE_DELETE表示隨後打開操作對象會成功,但只有刪除訪問請求的權限;如果是FILE_SHARE_READ隨後打開操作對象會成功只有請求讀訪問的權限;如果是FILE_SHARE_WRITE 隨後打開操作對象會成功,但只有請求寫訪問的權限。
lpSecurityAttributesSECURITY_ATTRIBUTES, 指向一個SECURITY_ATTRIBUTES結構的指針,定義了文件的安全特性(如果操作系統支持的話)
dwCreationDispositionLong,下述常數之一:
CREATE_NEW 創建文件;如文件存在則會出錯
CREATE_ALWAYS 創建文件,會改寫前一個文件
OPEN_EXISTING 文件必須已經存在。由設備提出要求
OPEN_ALWAYS 如文件不存在則創建它
TRUNCATE_EXISTING 將現有文件縮短為零長度
dwFlagsAndAttributesLong, 一個或多個下述常數
FILE_ATTRIBUTE_ARCHIVE 標記歸檔屬性
FILE_ATTRIBUTE_COMPRESSED 將文件標記為已壓縮,或者標記為文件在目錄中的默認壓縮方式
FILE_ATTRIBUTE_NORMAL 默認屬性
FILE_ATTRIBUTE_HIDDEN 隱藏文件或目錄
FILE_ATTRIBUTE_READONLY 文件為只讀
FILE_ATTRIBUTE_SYSTEM 文件為系統文件
FILE_FLAG_WRITE_THROUGH 操作系統不得推遲對文件的寫操作
FILE_FLAG_OVERLAPPED 允許對文件進行重疊操作
FILE_FLAG_NO_BUFFERING 禁止對文件進行緩衝處理。文件只能寫入磁盤卷的扇區塊
FILE_FLAG_RANDOM_ACCESS 針對隨機訪問對文件緩衝進行優化
FILE_FLAG_SEQUENTIAL_SCAN 針對連續訪問對文件緩衝進行優化
FILE_FLAG_DELETE_ON_CLOSE 關閉了上一次打開的句柄後,將文件刪除。特別適合臨時文件
也可在Windows NT下組合使用下述常數標記:
SECURITY_ANONYMOUS, SECURITY_IDENTIFICATION, SECURITY_IMPERSONATION, SECURITY_DELEGATION, SECURITY_CONTEXT_TRACKING, SECURITY_EFFECTIVE_ONLY
hTemplateFile,hTemplateFile為一個文件或設備句柄,表示按這個參數給出的句柄為模板創建文件(就是將該句柄文件拷貝到lpFileName指定的路徑,然後再打開)。它將指定該文件的屬性擴展到新創建的文件上面,這個參數可用於將某個新文件的屬性設置成與現有文件一樣,並且這樣會忽略dwAttrsAndFlags。通常這個參數設置為NULL,為空表示不使用模板,一般為空。
PB 聲明
public function long createfile (string lpfilename,long dwdesiredaccess,long dwsharemode,long lpsecurityattributes,long dwcreationdisposition,long dwflagsandattributes,long htemplatefile) library "kernel32" alias for "CreateFileA" [1] 

CreateFile誤區

CreateFile的涵義是創建File這個內核對象,而不是創建物理磁盤上的“文件”。在Win32 API中有一系列操作內核對象的函數,創建內核對象的函數大多命名為CreateXxxx型。 [1] 
參考資料