http://blog.csdn.net/virtualdesk/article/details/4379939
http://blog.csdn.net/virtualdesk/article/details/4379965
读写文件是每个
Windows
软件开发人员都需要做的工作。可见这项工作是非常重要的,毕竟各种各样的数据都需要保存起来,以便作各种各样的分析,或者通过网络传送给别人。像大家用
BT
下载的电影,在那个
BT
软件里,就需要不断从网络里接收到数据,然后再把这些数据保存到文件里合适的位置,就可以生成跟发行者那里一样的文件,这样才可以播放出来。又比如我在玩《征途》的游戏里,刚刚打开游戏时,它就不断从服务器上下载更新的文件下来,然后保存到硬盘。
WriteFile
函数是用来写数据到文件,
ReadFile
函数是从文件里读取数据出来。但这两个函数不但可以读取写磁盘的文件,也可以接收和发送网络的数据,还有读写串口、
USB
、并口等设备的数据。在读写文件里,首先就是先打开文件,然后判断打开是否成功。在写文件时,同时要注意磁盘的空间是否满等问题。在读取文件时,往往需要读取不同位置的文件,比如要读取一个
4G
的视频文件,就不可能完全把它读取到内存里,因此就需要对文件进行定位读取。
函数
WriteFile
和
ReadFile
声明如下:
WINBASEAPI
BOOL
WINAPI
WriteFile(
__in HANDLE hFile,
__in_bcount(nNumberOfBytesToWrite) LPCVOID lpBuffer,
__in DWORD nNumberOfBytesToWrite,
__out_opt LPDWORD lpNumberOfBytesWritten,
__inout_opt LPOVERLAPPED lpOverlapped
);
WINBASEAPI
BOOL
WINAPI
ReadFile(
__in HANDLE hFile,
__out_bcount_part(nNumberOfBytesToRead, *lpNumberOfBytesRead) LPVOID lpBuffer,
__in DWORD nNumberOfBytesToRead,
__out_opt LPDWORD lpNumberOfBytesRead,
__inout_opt LPOVERLAPPED lpOverlapped
);
hFile
是文件句柄。
lpBuffer
是读写数据缓冲区。
nNumberOfBytesToWrite
是多少数据要写入。
lpNumberOfBytesWritten
是已经写入多少数据。
nNumberOfBytesToRead
是多少数据要读取。
nNumberOfBytesToRead
是已经读取多少数据。
lpOverlapped
是异步读写的结构。
调用函数的例子如下:
#001 //
创建、写入、读取文件。
#002 //
蔡军生
2007/10/21 QQ:9073204
深圳
#003 void CreateFileDemo(void)
#004 {
#005 //
#006 HANDLE hFile = ::CreateFile(_T("CreateFileDemo.txt"), //
创建文件的名称。
#007 GENERIC_WRITE|GENERIC_READ, //
写和读文件。
#008 0, //
不共享读写。
#009 NULL, //
缺省安全属性。
#010 CREATE_ALWAYS, //
如果文件存在,也创建。
#011 FILE_ATTRIBUTE_NORMAL, //
一般的文件。
#012 NULL); //
模板文件为空。
#013
#014 if (hFile == INVALID_HANDLE_VALUE)
#015 {
#016 //
#017 OutputDebugString(_T("CreateFile fail!/r/n"));
#018 }
#019
#020 //
往文件里写数据。
#021 const int BUFSIZE = 4096;
#022 char chBuffer[BUFSIZE];
#023 memcpy(chBuffer,"Test",4);
#024 DWORD dwWritenSize = 0;
#025 BOOL bRet = ::WriteFile(hFile,chBuffer,4,&dwWritenSize,NULL);
#026 if (bRet)
#027 {
#028 //
#029 OutputDebugString(_T("WriteFile
写文件成功
/r/n"));
#030 }
#031
#032 //
先把写文件缓冲区的数据强制写入磁盘。
#033 FlushFileBuffers(hFile);
#034
#035 //
#036 //
从文件里读取数据。
#037 LONG lDistance = 0;
#038 DWORD dwPtr = SetFilePointer(hFile, lDistance, NULL, FILE_BEGIN);
#039 if (dwPtr == INVALID_SET_FILE_POINTER)
#040 {
#041 //
获取出错码。
#042 DWORD dwError = GetLastError() ;
#043 //
处理出错。
#044 }
#045
#046 DWORD dwReadSize = 0;
#047 bRet = ::ReadFile(hFile,chBuffer,4,&dwReadSize,NULL);
#048 if (bRet)
#049 {
#050 //
#051 OutputDebugString(_T("ReadFile
读文件成功
/r/n"));
#052 }
#053 else
#054 {
#055 //
获取出错码。
#056 DWORD dwError = GetLastError();
#057 //
处理出错。
#058 TCHAR chErrorBuf[1024];
#059 wsprintf(chErrorBuf,_T("GetLastError()=%d/r/n"),dwError);
#060 OutputDebugString(chErrorBuf);
#061 }
#062
#063 }
32位程序专用文件操作函数
WINAPI中还有一组32位程序专用的文件操作函数,这也是M$推荐使用的函数,但我还是推荐使用BCB的库函数,除非功能不足,由于此类函数众多,我就只对重要的作简要介绍,如果真需要时可查询帮助系统。
函数 | 功能 |
CreateFile() | 创建或打开一个文件 |
CopyFile(),CopyFileEx() | 拷贝文件 |
CreateDirectory(),CreateDirectoryEX() | 创建目录 |
DeleteFile() | 删除文件 |
GetDriveType() | 获取驱动器类型 |
GetFileAttributes(),GetFileAttributesEx() | 获取文件属性 |
GetFileSize() | 获取文件字节大小 |
GetFullPathName() | 取得文件全路径文件名 |
GetShortPathName() | 取得文件8.3格式全文件名 |
GetTempFileName() | 生成一个临时文件名 |
GetTempPath() | 取临时文件名的路径 |
LockFile(),LockFileEx() | 锁文件 |
MoveFileEx() | 移动或更名文件 |
ReadFile(),ReadFileEx() | 读文件 |
SearchPath() | 搜寻文件 |
SetFileAttributes() | 设置文件属性 |
SetFilePoint() | 设置文件读写位置 |
UnLockFile(),UnLockFileEx() | 对文件解除锁定 |
WriteFile(),WriteFileEx() | 写文件 |