[Win32]ReadFile/WriteFile 的文件同步读写
来源:互联网 发布:vb冒泡排序法代码 编辑:程序博客网 时间:2024/05/20 05:23
本文由CSDN用户zuishikonghuan所作,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/details/46926787
先来看看我很早之前写的两个函数,他们实现了简单的直接读写文件,读文件是把文件一股脑都读进来,写文件是覆盖原来的文件写入
//参数:文件名,输出的字符串指针//返回值:读取的大小DWORD MyReadFile(char* fn, char* &out){HANDLE pfile;pfile = CreateFile(fn, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);//创建文件内核对象if (pfile == INVALID_HANDLE_VALUE)//打开文件失败{CloseHandle(pfile);return 0;}DWORD filesize = GetFileSize(pfile, NULL);//获取文件大小char* buffer = new char[filesize + 1];//申请内存,最后一位为字符串的结束符。DWORD readsize;if (ReadFile(pfile, buffer, filesize, &readsize, NULL) == 0){CloseHandle(pfile);return 0;}buffer[filesize] = 0;out = buffer;//delete [] buffer;//注意这里需要自己释放内存CloseHandle(pfile);return filesize;}//参数:文件名,欲写入的字符串//返回值:写入的大小DWORD MyWriteFile(char* fn, char* in){HANDLE pfile;pfile = CreateFile(fn, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (pfile == INVALID_HANDLE_VALUE){CloseHandle(pfile);return 0;}DWORD size;if (WriteFile(pfile, in, strlen(in), &size, NULL) == 0){CloseHandle(pfile);return 0;}CloseHandle(pfile);return size;}
注意,只能在Ansi版本上使用,如果是unicode版本请:
方法一:改变Api:CreateFile->CreateFileA
方法二:将文件名称从char*改为wchar_t*或者改为LPCTSTR
下面来详细说一说ReadFile/WriteFile 的文件同步读写
1。何为“同步读写”?
同步读写是指读写过程中线程是“阻塞”的,我在API Caller,计算机网络和算法 一文中(http://blog.csdn.net/zuishikonghuan/article/details/46861619)写到了windows对API的处理过程,同步读写是指api调用进入内核后不返回,因此线程进入“阻塞”状态,由驱动程序完成读写后,系统按照一定的方式把数据交还给应用程序,同时api返回,线程继续执行,异步就正好相反了,api调用后直接返回,应用程序可以在内核读写的时候做一些事情。
2。CreateFile
MSDN:https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx
函数原型:
HANDLE WINAPI CreateFile( _In_ LPCTSTR lpFileName, _In_ DWORD dwDesiredAccess, _In_ DWORD dwShareMode, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _In_ DWORD dwCreationDisposition, _In_ DWORD dwFlagsAndAttributes, _In_opt_ HANDLE hTemplateFile);
其实CreateFile不仅能打开文件,还可以打开设备的符号链接,但是这不在今天讨论的内容中了
lpFileName:文件名称(ansi下为char*,Unicode下为wchar_t*)其实 LPCTSTR 就是 const TCHAR*
dwDesiredAccess:GENERIC_READ:读取、 GENERIC_WRITE:写入
dwShareMode:共享方式
如果此参数为零,CreateFile成功的文件或设备不能共享,不能被再次打开,直到关闭的文件或设备的句柄。
FILE_SHARE_DELETE:允许删除
FILE_SHARE_READ:允许读
FILE_SHARE_WRITE:允许写
lpSecurityAttributes:指向SECURITY_ATTRIBUTES结构的指针,一般为NULL
dwCreationDisposition:此参数必须是以下值,不能组合:
CREATE_ALWAYS:总是创建一个新的文件。
如果指定的文件存在,并且是可写的,函数将覆盖该文件。错误代码为183。
如果指定的文件不存在,并且是一个有效的路径,创建一个新的文件。错误代码为0。
CREATE_NEW:创建一个新的文件,只有当它不存在。
如果指定的文件存在,函数将失败,最后错误代码设置为 ERROR_FILE_EXISTS (80)。
如果指定的文件不存在,并且是可写的位置的有效路径,创建一个新文件。
OPEN_ALWAYS:始终打开一个文件。
如果指定的文件存在,函数执行成功,最后错误代码设置为183。
如果指定的文件不存在,并且是可写的位置的有效路径,该函数创建一个文件,最后错误代码设置为零。
OPEN_EXISTING:打开文件或设备,只有当它存在。
如果指定的文件或设备不存在,函数将失败,最后错误代码设置为 ERROR_FILE_NOT_FOUND (2)。
TRUNCATE_EXISTING:只有当它存在,打开一个文件并将它截断,其大小为零字节。
如果指定的文件不存在,函数将失败,最后错误代码设置为 ERROR_FILE_NOT_FOUND (2)。
调用进程必须使用作为一部分的 dwDesiredAccess 参数设置的 GENERIC_WRITE 位打开该文件。
CREATE_ALWAYS后OPEN_ALWAYS看起来似乎一样,但是在文件存在时,前者会覆盖原文件,而后者不会!因此一般都用CREATE_ALWAYS
dwFlagsAndAttributes:文件属性,一般为FILE_ATTRIBUTE_NORMAL
hTemplateFile:一般为NULL
果此函数成功,返回值是指定的文件、设备、命名的管道或邮件插槽的打开句柄。
3.ReadFile和WriteFile
BOOL WINAPI ReadFile( _In_ HANDLE hFile, _Out_ LPVOID lpBuffer, _In_ DWORD nNumberOfBytesToRead, _Out_opt_ LPDWORD lpNumberOfBytesRead, _Inout_opt_ LPOVERLAPPED lpOverlapped);
BOOL WINAPI WriteFile( _In_ HANDLE hFile, _In_ LPCVOID lpBuffer, _In_ DWORD nNumberOfBytesToWrite, _Out_opt_ LPDWORD lpNumberOfBytesWritten, _Inout_opt_ LPOVERLAPPED lpOverlapped);
hFile:文件句柄
lpBuffer:缓冲区
第三个参数:读取、写入的长度
第四个参数:一个DWORD的指针,用于接收实际读取、写入的长度(当lpOverlapped为非空时第四个参数才能为NULL)
lpOverlapped:一个指向OVERLAPPED 结构的指针
typedef struct _OVERLAPPED { ULONG_PTR Internal; ULONG_PTR InternalHigh; union { struct { DWORD Offset; DWORD OffsetHigh; }; PVOID Pointer; }; HANDLE hEvent;} OVERLAPPED, *LPOVERLAPPED;
只关心这两个:
Offset:文件传送的字节偏移量的低位字
OffsetHigh:文件传送的字节偏移量的高位字
比如我想从文件的指定位置读取、写入,就可以用这个
- [Win32]ReadFile/WriteFile 的文件同步读写
- win32 CreateFile readFile writefile 文件读写
- <Win32 API> 文件操作CreateFile/ReadFile/WriteFile
- 读写文件函数ReadFile和WriteFile解析
- CreateFile ReadFile WriteFile读写文件操作
- CreateFile、ReadFile、WriteFile和fread、fwrite两种读写文件的方法
- 使用API进行文件读写——CreateFile,ReadFile,WriteFile等
- 使用readfile 和 writefile 复制文件
- 使用CreateFile, ReadFile, WriteFile在Windows NT/2000/XP下读写绝对扇区的方法
- 使用CreateFile, ReadFile, WriteFile在Windows NT/2000/XP下读写绝对扇区的方法
- 使用CreateFile, ReadFile, WriteFile在Windows NT/2000/XP下读写绝对扇区的方法
- 使用CreateFile, ReadFile, WriteFile在Windows NT/2000/XP下读写绝对扇区的方法
- CreateFile WriteFile ReadFile FlushFileBuffers的基本用法
- C/C++ 文件操作之CreateFile、ReadFile和WriteFile
- C/C++ 文件操作之CreateFile、ReadFile和WriteFile
- WriteFile和ReadFile函数
- CreateFile ReadFile WriteFile 详解
- CreateFile ReadFile WriteFile 详解
- SQLite 约束 Constraints
- UITableView属性及方法大全
- 为什么mysql里的ibdata1文件不断的增长?
- 快学scala:笔记2
- 在做单点登陆过程中遇到的问题
- [Win32]ReadFile/WriteFile 的文件同步读写
- request.getContextPath()
- HTTPClient模块的HttpGet和HttpPost
- Android 带清除 和 晃动效果的 自定义 EditText 解析
- HDU 4763 Theme Section (KMP)
- 2012年5月SAT香港真题解析
- 使用缓存管理器,尽你之能力(Cache Me if You Can: Using the NT Cache Manager )
- linux内核中等待队列(wait_event,wake_up...)
- Java基础--三大特性