【WINAPI】CreateFile創建或打開設備


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 指定我們想以何種方式來和設備進行數據傳輸。

可以傳給CreateFile的dwDesiredAccess參數的通用標志
含義
0 我們不希望從設備讀取數據或向設備寫入數據。如果只想改變設備的配置(比如只是修改文件的時間戳),那么可以傳0
GENERIC_READ 允許對設備進行只讀訪問
GENERIC_WRITE 允許對設備進行只寫訪問。例如,備份軟件會用到這個標志,如果想把數據發送到打印機,也可以使用這個標志。注意,GENERIC_WRITE標志並沒有隱式地包含GENERIC_READ標志
GENERIC_READ|GENERIC_WRITE 允許對設備進行讀寫操作。由於這個標志允許我們和設備之間自由地交換數據,因此也最為常用


 
dwShareMode 用來指定設備共享特權。當我們仍然打開着一個設備的時候,該參數可以控制其他的CreateFile調用,能夠以何種方式來打開設備。 

可以傳給CreateFile的dwShareMode參數的與I/O相關的標志
含義
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 

可以傳給CreateFile的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. 文件屬性標志

可以傳給CreateFile的dwFlagsAndAttributes參數的值
標志 含義
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")


免責聲明!

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



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