WriteFile和GetSystemDirectory
文章目錄
- WriteFile函數(shù):
- 函數(shù)聲明
- 函數(shù)原型:
- 第一個參數(shù)
- 第二個參數(shù)
- 第三個參數(shù)
- 第四個參數(shù)
- 第五個參數(shù)
- 返回值:
- 代碼實現(xiàn):
- 運行截圖:
- 遺留疑問點:
- 疑問點已解決:
WriteFile函數(shù):
該函數(shù)的功能是往文件中寫數(shù)據(jù),該函數(shù)可用來完成同步和異步操作的。寫入的位置是由文件指針制定的文字,在完成寫操作后,文件的指針會移動到文件新增加的字節(jié)的最后(當(dāng)然這是在文件打開的方式不是FILE_FLAG_OVERLAPPED)。
注:并不是每種操作系統(tǒng)都支持在任何類型的設(shè)備上進行異步操作。windows 95不支持對磁盤文件的重疊讀取操作
函數(shù)聲明
WINBASEAPI BOOL WINAPI WriteFile(__in HANDLE hFile,__in_bcount(nNumberOfBytesToWrite) LPCVOID lpBuffer,__in DWORD nNumberOfBytesToWrite,__out_opt LPDWORD lpNumberOfBytesWritten,__inout_opt LPOVERLAPPED lpOverlapped);前面已經(jīng)介紹過ReadFile函數(shù),這里只需復(fù)習(xí)一下即可:
WINBASEAPI BOOL WINAPI ReadFile(__in HANDLE hFile,//hFile 是文件句柄。__out_bcount_part(nNumberOfBytesToRead, *lpNumberOfBytesRead) LPVOID lpBuffer,//lpBuffer 是讀寫數(shù)據(jù)緩沖區(qū)。nNumberOfBytesToWrite 是多少數(shù)據(jù)要寫入。lpNumberOfBytesWritten 是已經(jīng)寫入多少數(shù)據(jù)。__in DWORD nNumberOfBytesToRead,//nNumberOfBytesToRead 是多少數(shù)據(jù)要讀取。__out_opt LPDWORD lpNumberOfBytesRead,//nNumberOfBytesToRead 是已經(jīng)讀取多少數(shù)據(jù)。__inout_opt LPOVERLAPPED lpOverlapped//lpOverlapped 是異步讀寫的結(jié)構(gòu)。);函數(shù)原型:
BOOL WriteFile( HANDLE hFile, // handle to file LPCVOID lpBuffer, // data buffer DWORD nNumberOfBytesToWrite, // number of bytes to write LPDWORD lpNumberOfBytesWritten, // number of bytes written LPOVERLAPPED lpOverlapped // overlapped buffer );第一個參數(shù)
hFile——已經(jīng)打開的文件句柄。需要寫入數(shù)據(jù)的文件指針,這個指針指向的文件必須是GENERIC_WRITE access 訪問屬性的文件。
第二個參數(shù)
lpBuffer——緩沖區(qū)頭指針,它的類型是 LPCVOID ,可以不經(jīng)轉(zhuǎn)化地傳遞任意類型的指針,如果需要傳遞的是一個例化的結(jié)構(gòu)體,則可以使用“&”操作取地址。
第三個參數(shù)
nNumberOfBytesToWrite——將要寫入的字節(jié)數(shù)。如寫入零字節(jié),表示什么都不寫入,但會更新文件的“上一次修改時間”。針對位于遠(yuǎn)程系統(tǒng)的命名管道,限制在65535個字節(jié)以內(nèi)
第四個參數(shù)
lpNumberOfBytesWritten——實際寫入的字節(jié)數(shù)。
第五個參數(shù)
lpOverlapped——指向一個OVERLAPPED結(jié)構(gòu)。大多數(shù)情況使用NULL(將聲明變?yōu)锽yVal As Long,并傳遞零值)。,如果文件是以FILE_FLAG_OVERLAPPED方式打開的話,那么這個指針就不能為NULL
返回值:
如果函數(shù)成功返回TRUE,否則返回FALSE。會設(shè)置GetLastError
代碼實現(xiàn):
#include <iostream> #include<Windows.h> using namespace std; int main() {TCHAR szSystemDir[MAX_PATH];GetSystemDirectory(szSystemDir, MAX_PATH);printf("%s", szSystemDir);HANDLE hFile;DWORD dwWritten;hFile = CreateFile(L"text.txt",GENERIC_WRITE,0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);if (hFile != INVALID_HANDLE_VALUE) {if (!WriteFile(hFile, szSystemDir, lstrlen(szSystemDir), &dwWritten, NULL)){return GetLastError();}}CloseHandle(hFile); }運行截圖:
補充一下,為什么輸出控制臺界面為什么只有一個C,因為TCHAR是寬字符,然后printf默認(rèn)輸出是ASCII(多字節(jié)字符集),舉個例子,在寬字符下面,'A'占兩個字節(jié),對應(yīng)的值就是0x0065 而不是0x65,又因為內(nèi)存中小端序存放的原因 'A'在內(nèi)存里就是65 00,而%s這個格式化字符串,判斷字符串結(jié)尾的標(biāo)志就是讀到\00就結(jié)束,空格是0x20,所以遇到空格會繼續(xù)輸出。換用wprintf,輸出就行,然后就能看到嘍。。。
遺留疑問點:
然后呢,疑問點又來了,文件里面寫入的東西又和輸出控制臺的少了一個\system32了,讓人頭大
疑問點已解決:
WriteFile的第三個參數(shù)出問題,但是我測量的時候用的是lstrlen,用strlen測出來乘以2還可以讓人想通,但是這里lstrlen測的是寬字符長度,居然還要乘以2,我也表示無法理解。
解決答疑:這第三個參數(shù)傳遞的是字節(jié)數(shù),并非字符數(shù),lstrlen測出來的是寬字符的字符個數(shù),而我們第三個傳遞的是字節(jié)數(shù),所以乘以2,就可以把所需的內(nèi)存大小傳過去。就解決了。
到這里呢,我們的所有疑問一一擺平,謝謝各位
備注:
2021年堅持學(xué)寫博客第5天(學(xué)習(xí)兩個windows API) 尋夢SS
明日目標(biāo):
windows核心編程API函數(shù)
總結(jié)
以上是生活随笔為你收集整理的WriteFile和GetSystemDirectory的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GetFileAttributesEx读
- 下一篇: printf()详解