CreateFile,ReadFile,WriteFile几个windowsAPI函数

CreateFile原型

HANDLE CreateFile(LPCTSTR lpFileName, //普通文件名或者设备文件名
DWORD dwDesiredAccess, //访问模式(写/读)
DWORD dwShareMode, //共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
DWORD dwCreationDisposition, //如何创建
DWORD dwFlagsAndAttributes, //文件属性
HANDLE hTemplateFile //用于复制文件句柄
);

返回值:
HANDLE 这个类型定义 #typedef void *HANDLE
INVALID_HANDLE_VALUE 表示出错,会设置GetLastError()的值
如果操作成功,如果设置了属性CREATE_ALWAYS或OPEN_ALWAYS则,设置GetLastError()值为ERROR_ALWAYS_EXITS

参数列表说明:
1.LPCTSTR lpFileName文件名
2.DWORD dwDesiredAccess 设置访问方式
如下:
GENERIC_WRITE 只写
GENERIC_READ只读
如果值为0时,则表示只能获得设备的属性,不可以读写

3.DWORD dwShareMode, //共享模式
0 表示不共享文件
FILE_SHARE_READ 打开文件后只有读权限
FILE_SHARE_WRITE 打开文件后只有写权限
FILE_SHARE_DELETE 打开文件后只有删除权限

4.LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针

5.DWORD dwCreationDisposition, //如何创建
CREATE_NEW 创建文件;如文件存在则会出错
CREATE_ALWAYS 创建文件,会改写前一个文件
OPEN_EXISTING 文件必须已经存在。由设备提出要求
OPEN_ALWAYS 如文件不存在则创建它
TRUNCATE_EXISTING 将现有文件缩短为零长度

6.DWORD dwFlagsAndAttributes, //文件属性
通常都使用默认属性FILE_ATTRIBUTE_NORMAL
FILE_ATTRIBUTE_ARCHIVE 标记归档属性
FILE_ATTRIBUTE_COMPRESSED 将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式
FILE_ATTRIBUTE_NORMAL 默认属性
FILE_ATTRIBUTE_HIDDEN 隐藏文件或目录
FILE_ATTRIBUTE_READONLY 文件为只读
FILE_ATTRIBUTE_SYSTEM 文件为系统文件
FILE_FLAG_WRITE_THROUGH 操作系统不得推迟对文件的写操作
FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作
FILE_FLAG_NO_BUFFERING 禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块
FILE_FLAG_RANDOM_ACCESS 针对随机访问对文件缓冲进行优化
FILE_FLAG_SEQUENTIAL_SCAN 针对连续访问对文件缓冲进行优化
FILE_FLAG_DELETE_ON_CLOSE 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件

7.HANDLE hTemplateFile //用于复制文件句柄
hTemplateFile为一个文件或设备句柄,表示按这个参数给出的句柄为模板创建文件(就是将该句柄文件拷贝到lpFileName指定的路径,然后再打开)。它将指定该文件的属性扩展到新创建的文件上面,这个参数可用于将某个新文件的属性设置成与现有文件一样,并且这样会忽略dwAttrsAndFlags。通常这个参数设置为NULL,为空表示不使用模板,一般为空。
我理解的就是复制文件的属性,用hTemplateFile的句柄文件属性来设置打开文件的属性

与CreateFile相对应的是closehandle

BOOL CloseHandle(HANDLE hObject);

返回值:
执行成功返回非零值
执行失败返回零值
参数只有一个handle,CreateFile返回一个句柄,那么CloseHandle关闭这个句柄

ReadFile原型

BOOL ReadFile(
    HANDLE hFile,                                    //文件的句柄
    LPVOID lpBuffer,                                //用于保存读入数据的一个缓冲区
    DWORD nNumberOfBytesToRead,    //要读入的字节数
    LPDWORD lpNumberOfBytesRead,    //指向实际读取字节数的指针
    LPOVERLAPPED lpOverlapped
    //如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。
    //该结构定义了一次异步读取操作。否则,应将这个参数设为NULL
);

使用说明:
返回值,调用成功,返回非0值
调用失败,返回0

参数说明:
1.HANDLE hFile是收CreateFile产生的一个句柄需要操作的问题,至少此句柄具有GENERIC_READ访问属性权限
2.LPVOID ipBuffer,接收数据的缓冲区
3.LPDWORD ipNumberOfBytesRead,读取成功的字符数,指针
4.LPOVERLAPPED ipOverlapped 如果文件是以FILE_FLAG_OVERLAPPED方式打开的话,这个指针指向重叠操作

WriteFile原型

BOOL WriteFile(
HANDLE  hFile,//文件句柄
LPCVOID lpBuffer,//数据缓存区指针
DWORD   nNumberOfBytesToWrite,//你要写的字节数
LPDWORD lpNumberOfBytesWritten,//用于保存实际写入字节数的存储区域的指针
LPOVERLAPPED lpOverlapped//OVERLAPPED结构体指针
);

返回值:
调用成功,返回非零值
调用失败,返回0值
参数说明:
1.HANDLE hFile是收CreateFile产生的一个句柄需要操作的问题,至少此句柄具有GENERIC_READ访问属性权限
2.LPVOID ipBuffer,要写入数据的缓冲区
3.LPDWORD ipNumberOfBytesRead,写入成功的字符数,指针
4.LPOVERLAPPED ipOverlapped 如果文件是以FILE_FLAG_OVERLAPPED方式打开的话,这个指针指向重叠操作

#include 
#include 

#define BUF_SIZE 256

int main(int argc,LPTSTR argv[])
{
	HANDLE hIn,hOut;
	DWORD size_in,size_out;
	CHAR buffer[BUF_SIZE];

	if(3 != argc)
	{
		printf("程序使用方法:%s filename1 filename2",argv[0]);
		return 1;
	}

	hIn = CreateFile(argv[1],
		GENERIC_READ,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL);
	if(hIn == INVALID_HANDLE_VALUE)
	{
		printf("不能打开文件。错误代码:%d\n",GetLastError());
		return 1;
	}

	hOut = CreateFile(argv[2],
		GENERIC_WRITE,
		0,
		NULL,
		CREATE_ALWAYS,
		FILE_ATTRIBUTE_NORMAL,
		NULL);
	if(hOut == INVALID_HANDLE_VALUE)
	{
		printf("不能打开文件。错误代码:%d\n",GetLastError());
		return 2;
	}

	while(ReadFile(hIn,buffer,BUF_SIZE,&size_in,NULL) && size_in)
	{
		WriteFile(hOut,buffer,size_in,&size_out,NULL);
		if(size_in != size_out)
		{
			printf("产生严重错误!\n错误代码:%d\n",GetLastError());
			return 3;
		}
	}

	CloseHandle(hIn);
	CloseHandle(hOut);

	return 0;
}

你可能感兴趣的:(C)