在磁盘操作中磁盘写比读需要花更多的时间,并且大文件的异步写可以更加有效的提高CPU利用率。但是异步操作会给开发和调试带来一些麻烦,所以我建议除非在非常必要(性能要求非常高,文件非常大)的情况下才使用异步的磁盘读写。再提一点,对于磁盘文件的异步操作的方式同样可以用于上章所讲的命名管道,或者是串口的异步操作。
文件加锁时在打开文件后对文件的某个区域加锁,加锁后可以防止其他进程对该区域数据进行读取。相关的函数为:
BOOL LockFile( HANDLE hFile, // 文件句柄 DWORD dwFileOffsetLow, // 文件加锁开始位置低32位 DWORD dwFileOffsetHigh, // 文件加锁开始位置高32位 DWORD nNumberOfBytesToLockLow, // 区域长度低32位 DWORD nNumberOfBytesToLockHigh // 区域长度高32位 ); BOOL UnlockFile( HANDLE hFile, // 文件句柄 DWORD dwFileOffsetLow, // 文件解锁开始位置低32位 DWORD dwFileOffsetHigh, // 文件解锁开始位置高32位 DWORD nNumberOfBytesToLockLow, // 区域长度低32位 DWORD nNumberOfBytesToLockHigh // 区域长度高32位 );在文件加锁和解锁上需要有对应关系,这种对应关系就是对A区域加锁后必须对A区域解锁后才可以对其他区域解锁,而且必须是一对一的关系,也就是说调用一次对A区域的加锁函数就必须调用一次对A区域的解锁函数,而不能对一个区域加锁后分次对该区域的不同部分解锁。
在MFC中对文件操作进行了封装,CFile中封装了各种文件操作。在CFile中常用的成员函数有以下这些:
CFile( LPCTSTR lpszFileName, UINT nOpenFlags ); //打开文件 virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL ); //打开文件 uOpenFlags为打开文件时的参数,可以取的以下值的组合: CFile::modeRead / CFile::modeReadWrite / CFile::modeWrite 读写模式 CFile::modeCreate 创建文件 CFile::shareDenyNone / CFile::shareDenyRead / CFile::shareDenyWrite 共享设置 CFile::typeText / CFile::typeBinary 以文本形式还时二进制形式打开文件 virtual void Close( ); //关闭文件 virtual UINT Read( void* lpBuf, UINT nCount ); //读文件 virtual void Write( const void* lpBuf, UINT nCount ); // 写文件 virtual LONG Seek( LONG lOff, UINT nFrom ); //设置文件指针 void SeekToBegin( );//移动文件指针到文件头 DWORD SeekToEnd( );//移动文件指针到文件尾 virtual void LockRange( DWORD dwPos, DWORD dwCount ); //锁定文件 virtual void UnlockRange( DWORD dwPos, DWORD dwCount ); //解锁文件CStdioFile是CFile的派生类,主要是完成对文本文件的操作,它只有两个成员函数:
BOOL ReadString(CString& rString); //读入文件中一行 void WriteString( LPCTSTR lpsz );//将字符串作为一行写入文件