CreateFile() 打開與創建文件


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 文件系統的“再解析”行為


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM