WriteFile() 原型如下:
[C++] 纯文本查看 复制代码 BOOL WINAPI WriteFile(
__in HANDLE hFile,
__in LPCVOID lpBuffer,
__in DWORD nNumberOfBytesToWrite,
__out_opt LPDWORD lpNumberOfBytesWritten,
__inout_opt LPOVERLAPPED lpOverlapped
);
该函数用来向文件或设备中写入数据。
第 1 个参数 hFile 表示要写入数据的文件句柄,由 CreateFile() 创建,在调用 CreateFile() 打开文件时,需要指明 GENERIC_WRITE 写操作模式。
第 2 个参数 lpBuffer 指向存储要写入文件的数据的缓冲区。
第 3 个参数 nNumberOfBytesToWrite 表示要写入文件中的数据大小。
第 4 个参数 lpNumberOfBytesWritten 存储实际写入的数据大小。这是因为,由于某些原因,打算要写入的数据量并不一定等于实际写入的数据量。如果 lpOverlapped 这个参数为 NULL ,那么该参数就不能再设为 NULL
第 5 个参数 lpOverlapped 是指向 OVERLAPPED 结构的指针,如果在调用 CreateFile() 时设置了 FILE_FLAG_OVERLAPPED 标志,那么就要使用该参数,一般情况下可以设置为 NULL 。
测试代码:
[C++] 纯文本查看 复制代码 #include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "chs");
HANDLE hFileWrite;
CHAR lpFileDataBuffer[32];
DWORD dwWritedSize = 0;
ZeroMemory (lpFileDataBuffer, 32);
strcpy(lpFileDataBuffer,"为中华之崛起而读书!");
hFileWrite = CreateFile(argv[1], // 命令行中给出要写的文件
GENERIC_WRITE, // 写方式打开文件
FILE_SHARE_READ, // 可共享读
NULL, // 默认安全设置
OPEN_ALWAYS, // 只打开已存在的文件
FILE_ATTRIBUTE_NORMAL, // 常规文件属性
NULL ); // 无模板
if (hFileWrite == INVALID_HANDLE_VALUE) {
_tprintf (TEXT("打开文件失败: %d"), GetLastError());
return (-1);
}
SetFilePointer(hFileWrite, 0, 0, FILE_END); // 写到文件尾
if ( !WriteFile(hFileWrite, lpFileDataBuffer, strlen("为中华之崛起而读书!"), &dwWritedSize, NULL) ) {
_tprintf (TEXT("写文件错误: %d\n"), GetLastError());
CloseHandle (hFileWrite);
return (-2);
}
else
_tprintf (TEXT("写文件成功,共写入 %d 字节"), dwWritedSize);
CloseHandle (hFileWrite);
return 0;
}
运行输出:E:\>type groad.txt //显示要写入文件的初始内容
groad.net
D:\WinAPI\WriteFile\Debug>WriteFile.exe e:\groad.txt //写入文件
写文件成功,共写入 20 字节
E:\>type groad.txt //检验是否写入成功
groad.net为中华之崛起而读书!
注意,文本一般在系统中默认保存为 ANSI 格式,那么上面使用的 lpFileDataBuffer 数组就定义为 CHAR 类型,且使用 strlen() 和 strcpy() 这样的函数样式。如果文本保存为 Unicode 格式,那么数组应定义成 TCHAR 类型,strcpy() 这样的函数要替换为 lstrcpy() 这种样式。若是格式不对应,那么写入中文会发生乱码。 |