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