曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4373|回复: 0
打印 上一主题 下一主题

[文件与IO] WriteFile() -- 写文件或设备

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-2-16 10:52:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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() 这种样式。若是格式不对应,那么写入中文会发生乱码。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 17:11 , Processed in 0.081345 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表