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