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;
}