大家请看一下下面这段代码。在多个线程中循环调用如下类似的文件操作代码,但每个线程都对单独的文件进行操作,运行一段时间后抛出两个异常:(1)shareviolation;(2)FileNotFound.然后每个线程的文件都不能进行读些。
for(i=0;i<3;i++)
{
m_pFileCurrent->Close();//CFile* pFileCurrent
m_pFileCurrent->GetStatus(m_FileStatus);//CFileStatus m_FileStatus
m_FileStatus.m_ctime = m_tmFisrtGopGet ;//modify time
m_FileStatus.m_mtime = m_tmCurrentBlock;
m_FileStatus.m_atime = m_FileStatus.m_mtime;
m_pFileCurrent->SetStatus((LPCTSTR)m_szFileName,m_FileStatus);
m_nCounter = 0;
m_pFileCurrent->Open(m_szFileName, CFile::modeRead | CFile::modeWrite );
m_pFileCurrent->SeekToEnd();
}
for(i=0;i<3;i++)
{
m_pFileCurrent->Close();//CFile* pFileCurrent
m_pFileCurrent->GetStatus(m_FileStatus);//CFileStatus m_FileStatus
m_FileStatus.m_ctime = m_tmFisrtGopGet ;//modify time
m_FileStatus.m_mtime = m_tmCurrentBlock;
m_FileStatus.m_atime = m_FileStatus.m_mtime;
m_pFileCurrent->SetStatus((LPCTSTR)m_szFileName,m_FileStatus);
m_nCounter = 0;
m_pFileCurrent->Open(m_szFileName, CFile::modeRead | CFile::modeWrite );
m_pFileCurrent->SeekToEnd();
}
//example for CFile::GetStatus
CFileStatus status;
extern CFile cfile;
if( cfile.GetStatus( status ) ) // virtual member function
{
#ifdef _DEBUG
afxDump << "File size = " << status.m_size << "\n";
#endif
}
char* pFileName = "test.dat";
if( CFile::GetStatus( pFileName, status ) ) // static function
{
#ifdef _DEBUG
afxDump << "Full file name = " << status.m_szFullName << "\n";
#endif
}
m_pFileCurrent->Open(m_szFileName,
CFile::modeReadWrite|CFile::modeshareDenyNone
);