Windows API之WriteFile函数详细解答
WriteFile
WriteFile函數(shù)將數(shù)據(jù)寫(xiě)到一個(gè)文件中,它是為同步和異步操作而設(shè)計(jì)的。函數(shù)在文件指針指示的位置開(kāi)始向文件寫(xiě)入數(shù)據(jù)。寫(xiě)操作完成后,文件指針將根據(jù)實(shí)際寫(xiě)入的字節(jié)數(shù)進(jìn)行調(diào)整,除非文件是用FILE_FLAG_OVERLAPPED打開(kāi)的。如果文件句柄是為重疊的輸入和輸出(I/O)創(chuàng)建的,則應(yīng)用程序必須在寫(xiě)操作完成后調(diào)整文件指針的位置。
BOOL WriteFile (
handle hFile, //處理要寫(xiě)入的文件
LPCVOID lpBuffer, //指向要寫(xiě)入文件的數(shù)據(jù)的指針
DWORD nNumberOfBytesToWrite, //要寫(xiě)入的字節(jié)數(shù)
LPDWORD lpNumberOfBytesWritten, //指針寫(xiě)入的字節(jié)數(shù)
指向重疊I/O結(jié)構(gòu)的指針
);
參數(shù)
hFile
要寫(xiě)入的文件的句柄。文件句柄必須是使用對(duì)文件的GENERIC_WRITE訪問(wèn)權(quán)限創(chuàng)建的。
Windows NT:
對(duì)于異步寫(xiě)操作,hFile可以是CreateFile函數(shù)用FILE_FLAG_OVERLAPPED標(biāo)記打開(kāi)的任何句柄,也可以是thesocket或accept函數(shù)返回的套接字句柄。
Windows 95:
對(duì)于異步寫(xiě)操作,hFile可以是通信資源、郵件槽或命名管道句柄,由CreateFile使用FILE_FLAG_OVERLAPPED標(biāo)記打開(kāi),也可以是套接字或accept函數(shù)返回的套接字句柄。Windows 95不支持對(duì)磁盤(pán)文件進(jìn)行異步寫(xiě)操作。
lpBuffer
指向包含要寫(xiě)入文件的數(shù)據(jù)的緩沖區(qū)的指針。
nNumberOfBytesToWrite
要寫(xiě)入文件的字節(jié)數(shù)。
0的值指定一個(gè)空寫(xiě)操作??諏?xiě)操作不寫(xiě)入任何字節(jié),但會(huì)導(dǎo)致時(shí)間戳更改。
跨網(wǎng)絡(luò)的命名管道寫(xiě)操作限制為65,535字節(jié)。
lpNumberOfBytesWritten
指向此函數(shù)調(diào)用寫(xiě)入的字節(jié)數(shù)的指針。WriteFile在執(zhí)行任何工作或錯(cuò)誤檢查之前將此值設(shè)置為0。
如果llapped是NULL, lpNumberOfBytesWritten不能為空。
windowsnt:如果llapping不為空,lpNumberOfBytesWritten可以為空。如果這是一個(gè)重疊的寫(xiě)操作,那么可以通過(guò)調(diào)用GetOverlappedResult來(lái)獲得寫(xiě)的字節(jié)數(shù)。如果hFile與I/O完成端口相關(guān)聯(lián),則可以通過(guò)調(diào)用GetQueuedCompletionStatus獲得寫(xiě)入的字節(jié)數(shù)。
Windows 95和Windows 98:該參數(shù)不能為空。
lpOverlapped
指向重疊結(jié)構(gòu)的指針。如果用FILE_FLAG_OVERLAPPED打開(kāi)hFile,則需要這個(gè)結(jié)構(gòu)。
如果用FILE_FLAG_OVERLAPPED打開(kāi)hFile,則llapped參數(shù)不能為空。它必須指向有效的重疊結(jié)構(gòu)。如果用FILE_FLAG_OVERLAPPED打開(kāi)hFile,并且llapped為NULL,則該函數(shù)可能會(huì)錯(cuò)誤地報(bào)告寫(xiě)操作已經(jīng)完成。
如果用FILE_FLAG_OVERLAPPED打開(kāi)hFile,并且llapped不為空,則寫(xiě)操作從重疊結(jié)構(gòu)中指定的偏移量開(kāi)始,寫(xiě)文件可能在寫(xiě)操作完成之前返回。在本例中,WriteFile返回FALSE, GetLastError函數(shù)返回ERROR_IO_PENDING。這允許調(diào)用進(jìn)程在寫(xiě)操作完成時(shí)繼續(xù)處理。在重疊結(jié)構(gòu)中指定的事件在寫(xiě)操作完成時(shí)被設(shè)置為有信號(hào)狀態(tài)。
如果沒(méi)有使用FILE_FLAG_OVERLAPPED打開(kāi)hFile,并且llapped為NULL,則寫(xiě)操作從當(dāng)前文件位置開(kāi)始,直到操作完成后才返回WriteFile。
如果未使用FILE_FLAG_OVERLAPPED打開(kāi)hFile,并且llapped不為空,則從重疊結(jié)構(gòu)中指定的偏移量處開(kāi)始寫(xiě)操作,直到寫(xiě)操作完成后,WriteFile才返回。
返回值
如果函數(shù)成功,則返回值為非零。
如果函數(shù)失敗,則返回值為零。要獲取擴(kuò)展的錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError。
講話(huà)
當(dāng)使用FILE_FLAG_NO_BUFFERING打開(kāi)文件時(shí),應(yīng)用程序必須滿(mǎn)足某些要求:
文件訪問(wèn)必須從卷扇區(qū)大小的整數(shù)倍的文件中的字節(jié)偏移量開(kāi)始。要確定卷的扇區(qū)大小,請(qǐng)調(diào)用GetDiskFreeSpace函數(shù)。
文件訪問(wèn)必須是卷扇區(qū)大小的整數(shù)倍的字節(jié)數(shù)。例如,如果扇區(qū)大小是512字節(jié),則應(yīng)用程序可以請(qǐng)求讀寫(xiě)512、1024或2048字節(jié),但不能請(qǐng)求讀寫(xiě)335、981或7171字節(jié)。
用于讀寫(xiě)操作的緩沖區(qū)地址必須按扇區(qū)對(duì)齊(按內(nèi)存中卷扇區(qū)大小的整數(shù)倍進(jìn)行對(duì)齊)。扇區(qū)對(duì)齊緩沖區(qū)的一種方法是使用VirtualAlloc函數(shù)來(lái)分配緩沖區(qū)。此函數(shù)分配按地址對(duì)齊的內(nèi)存
總結(jié)
以上是生活随笔為你收集整理的Windows API之WriteFile函数详细解答的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CreateThread创建线程函数详细
- 下一篇: java信息管理系统总结_java实现科