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