CreateFile函数
说明:
创建或打开文件或I / O设备。 最常用的I / O设备如下:
文件,文件流,目录,物理磁盘,卷,控制台缓冲区,磁带驱动器,通信资源,邮槽和管道。 该函数返回一个句柄,该句柄可用于访问各种类型I / O的文件或设备,具体取决于文件或设备以及指定的标志和属性。
要将此操作作为事务操作执行,从而产生可用于事务I / O的句柄,请使用CreateFileTransacted
函数。
原型:
HANDLE CreateFile(
LPCTSTR lpFileName, // 指向文件名的指针
DWORD dwDesiredAccess, // 访问模式(写 / 读)
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指针
DWORD dwCreationDisposition, // 如何创建
DWORD dwFlagsAndAttributes, // 文件属性
HANDLE hTemplateFile // 用于复制文件句柄
);
0x01.参数
返回值
如执行成功,则返回文件句柄。 INVALID_HANDLE_VALUE
表示出错,会设置 GetLastError
。即使函数成功,但若文件存在,且指定了 CREATE_ALWAYS
或 OPEN_ALWAYS
,GetLastError
也会设为 ERROR_ALREADY_EXISTS
。
0x02. ReadFile函数
从文件指针指向的位置开始将数据读出到一个文件中, 且支持同步和异步操作,如果文件打开方式没有指明FILE_FLAG_OVERLAPPED
的话,当程序调用成功时,它将实际读出文件的字节数保存到lpNumberOfBytesRead
指明的地址空间中。FILE_FLAG_OVERLAPPED
允许对文件进行重叠操作。
原型
BOOL WINAPI ReadFile(
_In_ HANDLE hFile, // 文件句柄
_Out_ LPVOID lpBuffer, // 接收数据用的 buffer
_In_ DWORD nNumberOfBytesToRead,// 要读取的字节数
_Out_opt_ LPDWORD lpNumberOfBytesRead, // 实际读取到的字节数
_Inout_opt_ LPOVERLAPPED lpOverlapped // OVERLAPPED 结构,一般设定为 NULL
);
实例
BOOL Read(char *filePath)
{
HANDLE pFile;
DWORD fileSize;
char *buffer,*tmpBuf;
DWORD dwBytesRead,dwBytesToRead,tmpLen;
pFile = CreateFile(filePath,GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING, //打开已存在的文件
FILE_ATTRIBUTE_NORMAL,
NULL);
if ( pFile == INVALID_HANDLE_VALUE)
{
printf("open file error!\n");
CloseHandle(pFile);
return FALSE;
}
fileSize = GetFileSize(pFile,NULL); //得到文件的大小
buffer = (char *) malloc(fileSize);
ZeroMemory(buffer,fileSize);
dwBytesToRead = fileSize;
dwBytesRead = 0;
tmpBuf = buffer;
do{ //循环读文件,确保读出完整的文件
ReadFile(pFile,tmpBuf,dwBytesToRead,&dwBytesRead,NULL);
if (dwBytesRead == 0)
break;
dwBytesToRead -= dwBytesRead;
tmpBuf += dwBytesRead;
} while (dwBytesToRead > 0);
// TODO 处理读到的数据 buffer
free(buffer);
CloseHandle(pFile);
return TRUE;
}
0x03.WriteFile函数
将数据写入一个文件。该函数比fwrite
函数要灵活的多。也可将这个函数应用于对通信设备、管道、套接字以及邮槽的处理。返回时,TRUE
(非零)表示成功,否则返回零。会设置GetLastError
。
原型
BOOL
WINAPI WriteFile(
_In_ HANDLE hFile, // 文件句柄
_In_ LPCVOID lpBuffer, // 要写入的数据
_In_ DWORD nNumberOfBytesToWrite,// 要写入的字节数
_Out_opt_ LPDWORD lpNumberOfBytesWritten,// 实际写入的字节数
_Inout_opt_ LPOVERLAPPED lpOverlapped // OVERLAPPED 结构,一般设定为 NULL
);
实例
BOOL Write(char *buffer, DWORD contentLen)
{
HANDLE pFile;
char *tmpBuf;
DWORD dwBytesWrite,dwBytesToWrite;
pFile = CreateFile(filePath,GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS, //总是创建文件
FILE_ATTRIBUTE_NORMAL,
NULL);
if ( pFile == INVALID_HANDLE_VALUE)
{
printf("create file error!\n");
CloseHandle(pFile);
return FALSE;
}
dwBytesToWrite = contentLen;
dwBytesWrite = 0;
tmpBuf = buffer;
do{ //循环写文件,确保完整的文件被写入
WriteFile(pFile,tmpBuf,dwBytesToWrite,&dwBytesWrite,NULL);
dwBytesToWrite -= dwBytesWrite;
tmpBuf += dwBytesWrite;
} while (dwBytesToWrite > 0);
CloseHandle(pFile);
return TRUE;
}