新聞中心
剛開(kāi)始接觸編程可能會(huì)覺(jué)得Windows API是一個(gè)很神奇、很萬(wàn)能的工具,Windows API是Windows下開(kāi)發(fā)應(yīng)用程序的基礎(chǔ)知識(shí),不過(guò)基礎(chǔ)并不代表簡(jiǎn)單,能掌握好Windows API來(lái)開(kāi)發(fā)程序也是非常不容易的。

網(wǎng)站建設(shè)公司,為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及定制網(wǎng)站建設(shè)服務(wù),專(zhuān)注于企業(yè)網(wǎng)站制作,高端網(wǎng)頁(yè)制作,對(duì)成都戶(hù)外休閑椅等多個(gè)行業(yè)擁有豐富的網(wǎng)站建設(shè)經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。專(zhuān)業(yè)網(wǎng)站設(shè)計(jì),網(wǎng)站優(yōu)化推廣哪家好,專(zhuān)業(yè)成都網(wǎng)站營(yíng)銷(xiāo)優(yōu)化,H5建站,響應(yīng)式網(wǎng)站。
在Windows下,文件有很多種,比如圖片文件、視頻文件、音頻文件……這些文件都屬于保存在磁盤(pán)上的存儲(chǔ)格式不相同的文件。除了常見(jiàn)的磁盤(pán)文件格式外,管道、郵槽,甚至是設(shè)備對(duì)象,在Windows下也都被當(dāng)作文件來(lái)對(duì)待。這樣在編程的過(guò)程中,操作管道、郵槽、設(shè)備對(duì)象就如同操作文件一樣。
1. 文件的打開(kāi)與關(guān)閉
要對(duì)文件進(jìn)行操作,首先把要操作的文件打開(kāi),文件打開(kāi)成功后會(huì)返回一個(gè)可以用于操作文件的句柄,通過(guò)這個(gè)句柄就可以對(duì)文件進(jìn)行讀寫(xiě)操作了。
打開(kāi)文件的API函數(shù)定義如下:
- HANDLE CreateFile(
- LPCTSTR lpFileName,
- DWORD dwDesiredAccess,
- DWORD dwShareMode,
- LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- DWORD dwCreationDisposition,
- DWORD dwFlagsAndAttributes,
- HANDLE hTemplateFile
- );
參數(shù)說(shuō)明如下:
lpFileName:欲打開(kāi)或創(chuàng)建的文件名,這里也可以不是文件名,可以是設(shè)備對(duì)象之類(lèi)的被視為文件的相關(guān)對(duì)象。
dwDesiredAccess:對(duì)文件的訪問(wèn)模式,它指定了要對(duì)打開(kāi)的對(duì)象進(jìn)行何種操作。通常是 GENERIC_READ 和 GENERIC_WRITE,分別表示只讀模式和只寫(xiě)模式;還可以通過(guò)按位或運(yùn)算符同時(shí)指定兩種模式,如 GENERIC_READ | GENERIC_WRITE。
dwShareMode:打開(kāi)文件的共享模式,表示文件被打開(kāi)后是否允許其他進(jìn)程進(jìn)行操作,如果可以進(jìn)行操作,可以指定其操作的模式。
lpSecurityAttributes:該參數(shù)表示安全屬性,通過(guò)這個(gè)參數(shù)可以指定返回的文件句柄是否可以被子進(jìn)程繼承,如果參數(shù)設(shè)置為 NULL,表明無(wú)法被繼承,否則需要將參數(shù)指向一個(gè) SECURITY_ATTRIBUTES 的結(jié)構(gòu)體。該參數(shù)通常為 NULL。
dwCreationDisposition:在創(chuàng)建或打開(kāi)的文件存在或不存在時(shí)該函數(shù)的處理方式。
dwFlagsAndAttributes:該參數(shù)用來(lái)指定新建文件的屬性和對(duì)文件操作的方式。
hTemplateFile:文件模板句柄,系統(tǒng)會(huì)復(fù)制該文件模板的所有屬性到當(dāng)前創(chuàng)建的文件中。
該函數(shù)若執(zhí)行成功,則返回一個(gè)文件句柄;如果執(zhí)行失敗,則返回INVALID_HANDLE_ VALUE。具體失敗的原因可以通過(guò)調(diào)用GetLastError()函數(shù)來(lái)得到。
文件的打開(kāi)操作調(diào)用的是CreateFile()函數(shù),該函數(shù)名不像其名字那樣只能用于創(chuàng)建文件。CreateFile()函數(shù)既可以打開(kāi)文件,也可以創(chuàng)建文件。在Windows下有一個(gè)OpenFile()函數(shù)用來(lái)打開(kāi)文件,不過(guò)它是Win16的產(chǎn)物,在Win32下必須使用CreateFile()來(lái)打開(kāi)文件。
CreateFile()的參數(shù)很多,不過(guò)用習(xí)慣后會(huì)發(fā)現(xiàn)常用的參數(shù)都很容易記住,甚至有些參數(shù)常用的就是那么一兩個(gè)。在對(duì)文件操作完成后,需要對(duì)打開(kāi)文件的句柄進(jìn)行關(guān)閉以釋放資源。關(guān)閉對(duì)象句柄的函數(shù)非常簡(jiǎn)單,而且使用也非常廣泛。該函數(shù)的定義如下:
- BOOL CloseHandle(
- HANDLE hObject // handle to object
- );
該函數(shù)的參數(shù)只有一個(gè),這個(gè)參數(shù)就是調(diào)用CreateFile()函數(shù)時(shí)的返回值,也就是文件句柄。該函數(shù)并不僅僅能夠關(guān)閉文件句柄,事件句柄、進(jìn)程句柄、線程句柄等一系列對(duì)象句柄都可以用該函數(shù)進(jìn)行關(guān)閉。
2. 文件的操作
文件的操作有4種,分別是“增、刪、改、查”。接觸過(guò)數(shù)據(jù)庫(kù)的讀者一定感覺(jué)這些操作都是針對(duì)數(shù)據(jù)庫(kù)的,怎么對(duì)文件的操作也是這4種呢?其實(shí),不單單是對(duì)文件的操作存在增、刪、改、查,對(duì)注冊(cè)表、系統(tǒng)服務(wù)、進(jìn)程等的操作也都存在增、刪、改、查。只不過(guò)相對(duì)應(yīng)的有不同的Windows API函數(shù),而不是使用數(shù)據(jù)庫(kù)的SQL語(yǔ)句而已。
用文件的操作進(jìn)行舉例說(shuō)明。文件的“增”操作可以理解為創(chuàng)建文件,文件的“刪”操作可以理解為刪除文件,文件的“改”操作可以理解為對(duì)文件的寫(xiě)操作,文件的“查”操作可以理解為對(duì)文件的“讀”操作。
對(duì)于文件的讀寫(xiě)操作可以從狹義和廣義上進(jìn)行認(rèn)識(shí),狹義的“讀文件”就是讀取已打開(kāi)文件的內(nèi)容或數(shù)據(jù),而廣義的“讀文件”則可以是獲取文件的大小、創(chuàng)建時(shí)間和修改時(shí)間等,因?yàn)槲募拇笮 ?chuàng)建時(shí)間、修改時(shí)間也屬于文件的屬性,只是這些屬性不保存在本身的文件中。寫(xiě)操作也是同樣的道理。
下面介紹常用的文件的刪除操作、讀寫(xiě)操作所涉及的API函數(shù),具體的更多涉及文件操作的函數(shù)無(wú)法一一介紹,靠大家自行積累總結(jié)。
刪除文件的API函數(shù)定義如下:
- BOOL DeleteFile(
- LPCTSTR lpFileName
- );
該函數(shù)的參數(shù)只有一個(gè),lpFileName表示要?jiǎng)h除的文件的文件名。大部分的文件操作函數(shù)都是通過(guò)CreateFile()函數(shù)返回的文件句柄進(jìn)行操作,而DeleteFile()函數(shù)使用的文件名進(jìn)行操作的,如果文件被打開(kāi)以后,又怎么能刪除呢?
讀取文件內(nèi)容的函數(shù)如下:
- HANDLE hFile,
- LPVOID lpBuffer,
- DWORD nNumberOfBytesToRead,
- LPDWORD lpNumberOfBytesRead,
- LPOVERLAPPED lpOverlapped
- ;
參數(shù)說(shuō)明如下。
hFile:文件句柄,通常是 CreateFile()函數(shù)返回的句柄。
lpBuffer:指向一個(gè)緩沖區(qū),函數(shù)會(huì)將從文件中讀出的數(shù)據(jù)保存在該緩沖區(qū)中。
nNumberOfBytesToRead:要求讀入的字節(jié)數(shù),通常情況下是緩沖區(qū)的大小。
lpNumberOfBytesRead:指向一個(gè) DWORD 類(lèi)型的變量,用于返回實(shí)際讀入的字節(jié)數(shù)。
lpOverlapped:一般設(shè)置為 NULL。
寫(xiě)入文件內(nèi)容的函數(shù)如下:
- BOOL WriteFile(
- HANDLE hFile,
- LPCVOID lpBuffer,
- DWORD nNumberOfBytesToWrite,
- LPDWORD lpNumberOfBytesWritten,
- LPOVERLAPPED lpOverlapped
- );
WriteFile()函數(shù)的參數(shù)和ReadFile()函數(shù)的參數(shù)意義基本相同,所不同的是第2個(gè)參數(shù)。第2個(gè)參數(shù)仍然指向一個(gè)緩沖區(qū),WriteFile()函數(shù)會(huì)將該緩沖區(qū)的內(nèi)容進(jìn)行寫(xiě)入。當(dāng)用WriteFile()函數(shù)寫(xiě)文件時(shí),寫(xiě)入的數(shù)據(jù)通常被Windows暫時(shí)保存在內(nèi)部的高速緩存中,操作系統(tǒng)會(huì)定期進(jìn)行盤(pán)寫(xiě)入,從而避免頻繁進(jìn)行I/O操作影響執(zhí)行效率。為了保證數(shù)據(jù)即時(shí)寫(xiě)入可以使用FlushFileBuffers()函數(shù),該函數(shù)的定義如下:
- BOOL FlushFileBuffers(
- HANDLE hFile
- );
該函數(shù)會(huì)將指定文件句柄的緩沖區(qū)進(jìn)行清空,使得Windows將緩沖區(qū)中的文件寫(xiě)入磁盤(pán)。該函數(shù)只有一個(gè)參數(shù),即文件句柄。該文件句柄與ReadFile()和WriteFile()所使用的文件句柄相同。
在進(jìn)行文件讀寫(xiě)時(shí),往往并不是由前往后順序讀寫(xiě),通常是根據(jù)需要讀寫(xiě)文件的某個(gè)部分,這就需要對(duì)文件指針進(jìn)行移動(dòng),從而正確對(duì)文件進(jìn)行讀寫(xiě)操作。移動(dòng)文件指針的函數(shù)定義如下:
- DWORD SetFilePointer(
- HANDLE hFile,
- LONG lDistanceToMove,
- PLONG lpDistanceToMoveHigh,
- DWORD dwMoveMethod
- );
該函數(shù)的參數(shù)說(shuō)明如下。
hFile:進(jìn)行文件操作時(shí)的文件句柄,如同 ReadFile()和 WriteFile()。
lDistanceToMove:指定要移動(dòng)文件指針的距離。
lpDistanceToMoveHigh:一個(gè)指向 LONG 型的指針,移動(dòng)距離的高 32 位,一般為 NULL。
dwMoveMethod:指定移動(dòng)的起始位置??梢詮奈募_(kāi)始位置進(jìn)行移動(dòng)(FILE_BEGIN),可以從當(dāng)前文件位置開(kāi)始移動(dòng)(FILE_CURRENT),也可以從文件的末尾開(kāi)始移動(dòng)(FILE_END)。
3. 驅(qū)動(dòng)器及目錄相關(guān)操作
下面介紹目錄相關(guān)的操作,主要介紹4個(gè)相關(guān)函數(shù),分別是獲取本地所有邏輯驅(qū)動(dòng)器、獲取驅(qū)動(dòng)器類(lèi)型、創(chuàng)建目錄和移除目錄。下面介紹這4個(gè)函數(shù)的定義。
獲取本地所有邏輯驅(qū)動(dòng)器函數(shù)的定義如下:
- DWORD GetLogicalDriveStrings(
- DWORD nBufferLength,
- LPTSTR lpBuffer
- );
該函數(shù)的參數(shù)說(shuō)明如下。
nBufferLength:表示 lpBuffer 的長(zhǎng)度。
lpBuffer:表示接收本地邏輯驅(qū)動(dòng)器名的緩沖區(qū)。
該函數(shù)以字符串的形式返回本地所有可用的驅(qū)動(dòng)器名保存在lpBuffer中。返回字符串的形式如“C:\”,0,“D:\”,0,“E:\”,0,0。
獲取驅(qū)動(dòng)器類(lèi)型函數(shù)的定義如下:
- UINT GetDriveType(
- LPCTSTR lpRootPathName
- );
該函數(shù)只有一個(gè)參數(shù)lpRootPathName,要獲取邏輯驅(qū)動(dòng)器類(lèi)型的驅(qū)動(dòng)器名,如“C:\”。函數(shù)返回值取以下值之一。
- DRIVE_UNKNOWN:無(wú)法識(shí)別此驅(qū)動(dòng)器類(lèi)型;
- DRIVE_NO_ROOT_DIR:無(wú)效的驅(qū)動(dòng)器路徑;
- DRIVE_REMOVEABLE:可移動(dòng)驅(qū)動(dòng)器,如 U 盤(pán)、移動(dòng)硬盤(pán)等;
- DRIVE_FIXED:不可移動(dòng)驅(qū)動(dòng)器,指硬盤(pán);
- DRIVE_REMOTE:網(wǎng)絡(luò)驅(qū)動(dòng)器;
- DRIVE_CDROM:光盤(pán)驅(qū)動(dòng)器;
- DRIVE_RAMDISK:虛擬驅(qū)動(dòng)器。
創(chuàng)建目錄的函數(shù)定義如下:
- BOOL CreateDirectory(
- LPCTSTR lpPathName,
- LPSECURITY_ATTRIBUTES lpSecurityAttributes
- );
該函數(shù)的參數(shù)說(shuō)明如下。
lpPathName:創(chuàng)建目錄的目錄名稱(chēng)。
lpSecurityAttributes:安全屬性,一般設(shè)置為 NULL。
移除目錄的函數(shù)定義如下:
- BOOL RemoveDirectory(
- LPCTSTR lpPathName
- );
該函數(shù)的參數(shù)指定要移除的目錄的目錄名。
以上是關(guān)于驅(qū)動(dòng)器和目錄的幾個(gè)常用的API函數(shù)。
網(wǎng)站題目:網(wǎng)絡(luò)安全編程:文件相關(guān)操作API函數(shù)
文章地址:http://www.dlmjj.cn/article/dppsjhg.html


咨詢(xún)
建站咨詢(xún)
