1 HANDLE CreateFile( 2 PCTSTR pszName, 3 DWORD dwDesiredAccess, 4 DWORD dwShareMode, 5 PSECURITY_ATTRIBUTES psa, 6 DWORD dwCreationDisposition, 7 DWORD dwFlagsAndAttributes, 8 HANDLE hFileTemplate);
簡介:
函數作用:可以用來創建和打開磁盤文件以及其他設備。
返回值:若調用成功,返回句柄值;反之返回INVALID_HANDLE_VALUE(-1),而不是NULL!!
參數詳解:
pszName 表示設備的類型,也表示該類設備的某個實例
dwDesiredAccess 指定我們想以何種方式來和設備進行數據傳輸。
值 | 含義 |
0 | 我們不希望從設備讀取數據或向設備寫入數據。如果只想改變設備的配置(比如只是修改文件的時間戳),那么可以傳0 |
GENERIC_READ | 允許對設備進行只讀訪問 |
GENERIC_WRITE | 允許對設備進行只寫訪問。例如,備份軟件會用到這個標志,如果想把數據發送到打印機,也可以使用這個標志。注意,GENERIC_WRITE標志並沒有隱式地包含GENERIC_READ標志 |
GENERIC_READ|GENERIC_WRITE | 允許對設備進行讀寫操作。由於這個標志允許我們和設備之間自由地交換數據,因此也最為常用 |
dwShareMode 用來指定設備共享特權。當我們仍然打開着一個設備的時候,該參數可以控制其他的CreateFile調用,能夠以何種方式來打開設備。
值 | 含義 |
0 | 要求獨占對設備的訪問。如果設備已經打開,CreateFile調用會失敗。如果我們成功地打開了設備,那么后續的CreateFile調用會失敗 |
FILE_SHARE_READ | 如果有其他內核對象要使用該設備,我們要求它們不得修改設備的數據。如果設備已經以寫入方式或獨占方式打開,那么我們的CreateFile調用會失敗。如果我們成功地打開了設備,那么后續的使用了GENERIC_WRITE訪問標志的CreateFile調用會失敗 |
FILE_SHARE_WRITE | 如果有其他內核對象要使用該設備,我們要求它們不得讀取設備的數據。如果設備已經以讀取方式或獨占方式打開,那么我們的CreateFile調用會失敗。如果我們成功地打開了設備,那么后續的使用了GENERIC_READ訪問標志的CreateFile調用會失敗 |
FILE_SHARE_READ|FILE_SHARE_WRITE | 如果有其他內核對象要使用該設備,我們不關心它們會從設備讀取數據還是會向設備寫入數據。如果設備已經以獨占方式打開,那么我們的CreateFile調用會失敗。如果我們成功地打開了設備,那么后續的要求獨占讀取訪問、獨占寫入訪問或獨占讀寫訪問的CreateFile調用會失敗 |
FILE_SHARE_DELETE | 當對文件進行操作的時候,我們不關心文件是否被邏輯刪除或是被移動。在Windows內部,系統會先將文件標記為待刪除,然后當該文件所有已打開的句柄都被關閉的時候,再將其真正的刪除 |
psa 指向一個SECURITY_ATTRIBUTES結構,可以用來指定安全信息以及我們是否希望CreateFile返回的句柄能夠被繼承。通常,我們只需要傳NULL給psa參數,這表示用默認的安全設定來創建文件,並且返回的句柄是不可繼承的。
dwCreationDisposition
值 | 含義 |
CREATE_NEW | 告訴CreateFile創建一個新文件,如果同名文件已經存在,那么CreateFile會調用失敗 |
CREATE_ALWAYS | 告訴CreateFile無論同名文件存在與否都創建一個新文件。如果同名文件已經存在,那么CreateFile會覆蓋原來的文件 |
OPEN_EXISTING | 告訴CreateFile打開一個已有的文件或設備,如果文件或設備不存在,那么CreateFile會調用失敗 |
OPEN_ALWAYS | 告訴CreateFile打開一個已有的文件,如果文件存在,那么CreateFile會直接打開文件,如果文件不存在,那么CreateFile會創建一個新文件 |
TRUNCATE_EXISTING | 告訴CreateFile打開一個已有的文件並將文件的大小截斷為0字節,如果文件不存在,那么CreateFile會調用失敗 |
注意:調用CreateFile來打開文件之外的其他設備時,必須將OPEN_EXISTING傳給dwCreationDisposition參數
dwFlagsAndAttributes 參數有兩個用途:其一,它允許我們設置一些標志來微調與設備之間的通信;其二,如果設備是一個文件,我們還能夠設置文件的屬性。這些通信標志中的大多數都是一些信號,用來告訴系統我們打算以何種方式來訪問設備,這樣系統就可以對緩存算法進行優化,來幫助我們提高應用程序的效率。
通信標志:
1. CreateFile的高速緩存標志
FILE_FLAG_NO_BUFFERING 這個標志表示在訪問文件的時候不要使用任何數據緩存。
FILE_FLAG_SEQUENTIAL_SCAN 如果指定了這個標志,系統會認為我們將順序地訪問文件。當我們
FILE_FLAG_RANDOM_ACCESS 這個標志告訴系統不要提前讀取文件數據
FILE_FLAG_WRITE_THROUGH 這個標志禁止對文件寫入操作進行緩存以減少數據丟失的可能性。當我們對文件進行寫入操作的時候,系統會將所有對文件的修改直接寫入到磁盤中。
2. CreateFile的其他標志
FILE_FLAG_DELETE_ON_CLOSE在文件所有的句柄都關閉后,系統將刪除該文件。這個標志通常和FILE_ATTRIBUTE_TEMPORARY屬性一起使用。當這兩個標志都設置的時候,系統將為應用程序創建臨時文件,應用程序可以對其進行讀寫操作,當關閉文件時,系統將刪除文件。
FILE_FLAG_BACKUP_SEMANTICS這個標志一般用於備份和恢復軟件。。。。。
FILE_FLAG_POSIX_SEMANTICS
FILE_FLAG_OVERLAPPED 告訴系統我們想要以異步的方式來訪問設備
3. 文件屬性標志
標志 | 含義 |
FILE_ATTRIBUTE_ARCHIVE | 文件是一個存檔文件。應用程序用這個標志來將文件標記為待備份或待刪除。當CreateFile創建一個新文件的時候,會自動設置這個標志 |
FILE_ATTRIBUTE_ENCRYPTED | 文件是經過加密的 |
FILE_ATTRIBUTE_HIDDEN | 文件是隱藏的。它不會出現在通常的目錄清單中 |
FILE_ATTRIBUTE_NORMAL | 文件沒有其他屬性。只有單獨使用的時候,這個標志才有效 |
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED | 內容索引服務(content indexing service)不會對文件進行索引 |
FILE_ATTRIBUTE_OFFLINE | 文件雖然存在,但文件內容已經被轉移到脫機存儲器中。這個標志對層級存儲系統比較有用 |
FILE_ATTRIBUTE_READONLY | 文件是只讀的。應用程序可以讀取文件,但不能寫入文件或刪除文件 |
FILE_ATTRIBUTE_SYSTEM | 文件是操作系統的一部分,或專供操作系統使用 |
FILE_ATTRIBUTE_TEMPORARY | 文件數據只會使用一小段時間。為了將訪問時間降至最低,文件系統會盡量將文件數據保存在內存中,而不是保存在磁盤中 |
hFileTemplate 既可以是標識一個打開的文件的句柄,也可以是NULL。如果標識一個文件句柄,那么CreateFile會完全忽略dwFlagsAndAttributes參數,並轉而使用hFileTemplate所標識的文件的屬性。注意,hFileTemplate標識的文件必須是一個已經用GENERIC_READ標志打開的文件。如果CreateFile是打開已存在的文件(而不是創建新文件),那么它會忽略hFileTemplate參數。
常見錯誤:
當像pszName傳入文檔完整路徑的時候,斜杠“\”必須用轉義字符“\\”代替。
例如:文檔路徑為D:\myfiles\ReadMe.txt
傳入pszName參數的應為TEXT("D:\\myfiles\\ReadMe.txt")