CreateFile() 函數用以打開和創建文件,函數原型聲明如下:
1 HANDLE WINAPI CreateFile( 2 __in LPCTSTR lpFileName, 3 __in DWORD dwDesiredAccess, 4 __in DWORD dwShareMode, 5 __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, 6 __in DWORD dwCreationDisposition, 7 __in DWORD dwFlagsAndAttributes, 8 __in_opt HANDLE hTemplateFile 9 );
在 Windows 中,創建和打開文件的 API 都是 CreateFile() 函數,並通過指定不同的參數來表示是創建一個文件,打開已存在的文件,還是重新建立文件等。
第 1 個參數 lpFileName 是個輸入參數,表示操作的對象文件的相對路徑或絕對路徑。
第 2 個參數 dwDesiredAccess 是個輸入參數,指名對文件對象的操作存取方式,比如是 GENERIC_READ(讀文件),GENERIC_WRITE(寫文件) 。
第 3 個參數 dwShareMode 是個輸入參數,表示共享模式。指名與其他進程是否共享該文件,可以是共享讀(FILE_SHARE_READ),共享寫(FILE_SHARE_WRITE),共享刪除(FILE_SHARE_DELETE)。如果指名多個屬性,那么可用 "|" 將幾個屬性做或運算。如果本進程需要獨占本文件,那么就將該參數設置為 0 。
第 4 個參數 lpSecurityAttributes 是一個指向 SECURITY_ATTRIBUTES 結構的指針,表示本文件句柄的安全屬性,能影響其是否可被子進程繼承等操作。如果設為 NULL,則子進程不能繼承本句柄。該結構並不常用。
第 5 個參數 dwCreationDisposition 是個輸入參數,表示操作模式。
第 6 個參數 dwFlagsAndAttributes 是個輸入參數,是文件屬性和文件標志。
第 7 個參數 hTemplateFile 是個輸入參數,當存取權限包括 GENERIC_WRITE 時,可以設置為一個模板文件的句柄,一般情況下該參數可設為 NULL ,表示不使用模板文件。
函數的參數選項眾多,下面主要列出比較重要且常用的幾個進行說明。
dwShareMode
0 -- 文件不能共享,且本進程不能在這個文件上打開第 2 個 HANDLE 。
FILE_SHARE_READ -- 其他進程,包括進行本調用進程,可以打開這個文件並進行並發訪問。
FILE_SHARE_WRITE -- 允許並發寫文件。
lpSecurityAttributes
該參數指向一個 LPSECURITY_ATTRIBUTES 結構,一般使用中可置為 NULL 。
dwCreationDisposition
該參數指定是否創建文件,覆蓋現有文件等。選項有以下幾個:
1. CREATE_NEW
創建新文件,如果指定的文件已經存在那么失敗。
2. CREATE_ALWAYS
創建新文件,如果文件存在則重建該文件,清楚文件內容及文件屬性;如果文件不存在,則創建一個個新文件。
3. OPEN_EXISTING
打開現有文件,如果文件不存在則失敗。
4. OPEN_ALWAYS
如果文件存在,則打開文件;如果不存在,則創建它,此時等同於 CREATE_NEW。
5. TRUNCATE_EXISTING
將文件長度置為 0.使用該選項時,必須至少指定 GENERIC_WRITE 訪問權限,如果文件不存在時則失敗,對於已經存在的文件,則該文件的內容會被全部銷毀。
dwFlagsAndAttributes
該參數指定文件的屬性和長度,一共有 32 個標志和屬性。屬性是文件的特征,且與打開的文件句柄形成對照,如果打開的是現有文件,那么這些標志將被忽略。以下幾個是比較常見且重要的屬性和標志值。
1. FILE_ATTRIBUTE_NORMAL
該屬性只可在不設置其他屬性(可以設置標志)時才能使用。
2. FILE_ATTRIBUTE_READONLY
只讀文件,應用程序不能寫也不能刪除文件。
3. FILE_ATTRIBUTE_ARCHIVE
存檔文件
4. FILE_ATTRIBUTE_ENCRYPTED
加密文件
5. FILE_ATTRIBUTE_HIDDEN
隱藏文件
6. FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
沒有使用內容索引服務
7. FILE_ATTRIBUTE_OFFLINE
離線存儲文件
8. FILE_ATTRIBUTE_SYSTEM
系統文件
9. FILE_ATTRIBUTE_TEMPORARY
臨時文件
dwFlagsAndAttributes
1.FILE_FLAG_DELETE_ON_CLOSE
對臨時文件有用,當最后一個打開的句柄被關閉時,Windows 會刪除這個文件。
2.FILE_FLAG_OVERLAPPED
以異步 I/O 方式創建可打開文件,這個屬性標志對異步 I/O 比較重要。
3.FILE_FLAG_RANDOM_ACCESS
設置該屬性標志時,在程序對文件進行隨機訪問時,Windows 會嘗試優化文件緩存。
4.FILE_FLAG_SEQUENTIAL_SCAN
該屬性標志表示文件用於順序訪問,Windows 將相應的優化緩存。
5.FILE_FLAG_BACKUP_SEMANTICS
打開和創建文件是為了進行備份和恢復操作。
6.FILE_FLAG_NO_BUFFERING
不使用系統緩存(cahing,不同於硬件緩存)
5.FILE_FLAG_NO_BUFFERING
不使用系統緩存(cahing,不同於硬件緩存)
7.FILE_FLAG_NO_RECALL
遠程存儲
8.FILE_FLAG_WRITE_THROUGH
存取文件時,對磁盤進行直接操作,不經過緩存
9.FILE_FLAG_POSIX_SEMANTICS
按照 POSIX 規則存取
10.FILE_FLAG_OPEN_REPARSE_POINT
系統將禁止 NTFS 文件系統的“再解析”行為