首页 > 代码库 > Win32 API文件读写操作
Win32 API文件读写操作
1、文件的创建和打开
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
lpFileName:指定用于创建或打开的对象的名称;
dwDesiredAccess:指定对象的访问方式,包括:
0 --指定对象可设备查询访问;
GENERIC_READ --指定对象可读访问,可从文件中读取数据,并可移动文件中的指针;
GENERIC_WRITE --指定对象可写访问,可向文件中写入数据,并可移动文件中的指针;
dwShareMode:指定共享方式,包括:
FILE_SHARE_DELETE
FILE_SHARE_READ
FILE_SHARE_WRITE
lpSecurityAttributes:指向一个SECURITY_ATTRIBUTES结构的指针,用来确定返回的句柄是否能够被子进程所继承;
dwCreationDisposition:指定如何创建文件,包括:
CREATE_NEW --创建一个新文件,如果文件已存在,则函数调用失败;
CREATE_ALWAYS --创建一个新文件,如果文件已存在,清空该文件现有属性
OPEN_EXISTING --打开文件,如果文件不存在,则函数调用失败
OPEN_ALWAYS --如果文件存在,则打开文件;如果文件不存在,则创建一个新文件;
TRUNCATE_EXISTING --打开文件,文件打开时被截取使得其大小为0字节,调用该函数必须用GENERIC_WRITE的访问方式来打开文件;如果文件不存在,则函数调用失败;
dwFlagsAndAttributes:设置文件属性和标志,包括:
FILE_ATTRIBUTE_ARCHIVE --该文件是存档文件
FILE_ATTRIBUTE_HIDDEN --该文件是隐藏文件
FILE_ATTRIBUTE_NORMAL --该文件没有其他属性设置
FILE_ATTRIBUTE_OFFLINE --文件的数据已在物理上移动到离线存储设备中,不能立即使用
FILE_ATTRIBUTE_READONLY --该文件为只读文件
FILE_ATTRIBUTE_SYSTEM --该文件是操作系统文件
FILE_ATTRIBUTE_TEMPORARY --该文件做暂时存储使用
FILE_FLAG_WRITE_THROUGH --指示系统不经过缓存而直接将数据写入磁盘
FILE_FLAG_OVERLAPPED --指示系统初始化该文件对象,以便那些需要较长时间才能完成的操作返回ERROR_IO_PENDING标志
FILE_FLAG_NO_BUFFERING --指示系统以不带系统缓冲的方式打开该文件
FILE_FLAG_RANDOM_ACCESS --指示该文件是随机访问方式
FILE_FLAG_SEQUENTIAL_SCAN --指示该文件是顺序访问方式
FILE_FLAG_DELETE_ON_CLOSE --指示当该文件的所有句柄都被关闭后,操作系统将立即删除该文件
FILE_FLAG_BACKUP_SEMANTICS --表明是为备份或存储操作而打开或创建该文件的
FILE_FLAG_POSIX_SEMANTICS --表明将根据POSIX规则访问该文件
FILE_FLAG_OPEN_REPARSE_POINT --指定此标志禁止NTFS再分析点的再分析行为
FILE_FLAG_OPEN_NO_RECALL --表明虽然请求了该文件的数据,但该数据仍继续保存在远程存储器中而不应被传回本地存储器
hTemplateFile:如果打开一个已有文件,则这个参数将被忽略;要使这个参数有效必须满足:为创建新文件,给该参数传递的文件句柄必须是使用GENERIC_READ方式打开的;
2、文件的写入
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
hFile:指定要写入数据的文件的句柄
lpBuffer:指向包含将要写入文件的数据的缓冲区的指针
nNumberOfBytesToWrite:指明要向文件中写入的字节数
lpNumberOfBytesWritten:用来接收实际写入到文件中的字节数
lpOverlapped:指向OVERLAPPED结构体的指针,这个参数若要起作用,须在CreateFile打开文件设置文件属性时添加FILE_FLAG_OVERLAPPED标记,告诉系统需要异步地访问这个文件,默认情况下是以同步IO的方式访问的
3、文件的读取
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
hFile:指定要读取其数据的文件的句柄
lpBuffer:指向一个缓冲区的指针,该缓冲区将接收从文件中读取的数据
nNumberOfBytesToRead:指定从文件读取的字节数
lpNumberOfBytesRead:用来接收实际读到的字节数
lpOverlapped:指向OVERLAPPED结构体的指针,这个参数若要起作用,须在CreateFile打开文件设置文件属性时添加FILE_FLAG_OVERLAPPED标记,告诉系统需要异步地访问这个文件,默认情况下是以同步IO的方式访问的
例:
//定义一个句柄变量 HANDLE hFile; //创建文件 hFile = CreateFile("1.txt", GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); //接收实际写入的字节数 DWORD dwWrites; //写入数据 WriteFile(hFile, "hello world!", strlen("hello world!"), &dwWrites, NULL); //关闭文件句柄 CloseHandle(hFile);
HANDLE hFile; //打开文件 hFile = CreateFile("1.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //接收实际读取到的数据 char ch[100]; //接收实际读取到的字节数 DWORD dwReads; //读取数据 ReadFile(hFile, ch, 100, &dwReads, NULL); //设置字符串结束字符 ch[dwReads] = 0; //关闭打开的文件对象的句柄 CloseHandle(hFile); //显示读取到的数据 MessageBox(ch);
Win32 API文件读写操作