CreateFile 跟 fopen 不同,打开文件时不区分 文本方式 或 二进制 方式 ReadFile 或 WriteFile 都是对二进制数据进行操作
SetFilePointer -- 在一个打开文件中设置新的读取位置。 SetFilePointer – 返回值Long,返回一个新位置,它采用从文件起始处开始算起的一个字节偏移量
HANDLE WINAPI CreateFile( __in LPCTSTR lpFileName, // 文件路径 __in DWORD dwDesiredAccess, // 访问权限,GENERIC_READ | GENERIC_WRITE __in DWORD dwShareMode, // 共享模式,NULL | FILE_SHARE_READ | FILE_SHARE_WRITE __in LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性 __in DWORD dwCreationDisposition, // 创建配置, // CREATE_ALWAYS | CREATE_NEW | OPEN_ALWAYS | OPEN_EXISTING __in DWORD dwFlagsAndAttributes, // 扩展属性, // NULL | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY __in HANDLE hTemplateFile // 指定一个文件句柄,新文件将从这个文件中复制扩展属性。NULL ); BOOL WINAPI ReadFile( __in HANDLE hFile, // 文件句柄 __out LPVOID lpBuffer, // 接收数据用的 buffer __in DWORD nNumberOfBytesToRead, // 要读取的字节数 __out LPDWORD lpNumberOfBytesRead, // 实际读取到的字节数 __in LPOVERLAPPED lpOverlapped // OVERLAPPED 结构,一般设定为 NULL ); BOOL WINAPI WriteFile( __in HANDLE hFile, // 文件句柄 __in LPCVOID lpBuffer, // 要写入的数据 __in DWORD nNumberOfBytesToWrite, // 要写入的字节数 __out LPDWORD lpNumberOfBytesWritten, // 实际写入的字节数 __in LPOVERLAPPED lpOverlapped // OVERLAPPED 结构,一般设定为 NULL ); DWORD WINAPI GetFileSize( __in HANDLE hFile, // 文件句柄 __out LPDWORD lpFileSizeHigh // high-order 的返回值,一般设定为 NULL ); DWORD SetFilePointer( HANDLE hFile, //文件句柄 LONG lDistanceToMove, //偏移量(低位) PLONG lpDistanceToMoveHigh, //偏移量(高位) DWORD dwMoveMethod //基准位置 //FILE_BEGIN:文件开始位置 //FILE_CURRENT:文件当前位置 //FILE_END:文件结束位置 ); 备注说明 对于第二个和第三个参数进行了详细的说明: lpDistanceToMoveHigh 参数是用来管理大文件,如果要移到文件中任何位置,我们就必须设置这个参数的值。假如我们传入NULL值, 那么lDistanceToMove 的最大值是2^31–2(2G-2),因为所有文件指针的值是有符号的。因此,就算文件只有很少的机会能够达到这 个大小,我们最好还是把文件当成是一个大文件,并且在程序中使用64位的指针(就是lpDistanceToMoveHigh的值不是NULL)。如果 我们有一个压缩的并且文件很少的NTFS文件系统中,即使当前盘的空间不是很大的情况下,也很可能会有一些大文件。 假如lpDistanceToMoveHigh传入的不是NULL,那么lpDistanceToMoveHigh和lDistanceToMove会组成一个有符号的64位值。 lDistanceToMove参数是被作为这个值的低32们,lpDistanceToMoveHigh作为高32位,也就是说lpDistanceToMoveHigh是 lDistanceToMove的符号扩展名。 为了从0移动到2G位置,lpDistanceToMoveHigh必须设置为NULL或当作lDistanceToMove的符号扩展名。为了移动到大于2G的位置, 就要使用lpDistanceToMoveHigh和lDistanceToMove合成一个有符号的64位值。 读文件: void read(const wchar_t* strPath) { HANDLE hFile = ::CreateFile(strPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL, NULL); if (hFile != INVALID_HANDLE_VALUE) { DWORD nFileSize = ::GetFileSize(hFile, NULL); char* lpBuffer = new char[nFileSize]; DWORD nNumberOfBytesRead; BOOL bRet = ::ReadFile(hFile, lpBuffer, nFileSize, &nNumberOfBytesRead, NULL); // TODO ... delete[] lpBuffer; CloseHandle(hFile); } } 写文件: void write(const wchar_t* strPath, const wchar_t* strContent, const int nContentSize) { HANDLE hFile = ::CreateFile(strPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, NULL, NULL); if (hFile != INVALID_HANDLE_VALUE) { DWORD nNumberOfBytesWritten; ::WriteFile(hFile, strContent, nContentSize, &nNumberOfBytesWritten, NULL); // TODO ... CloseHandle(hFile); } }
CreateFile,ReadFile,WriteFile,GetFileSize,SetFilePointer
最新推荐文章于 2021-02-20 15:32:45 发布