bool CVFS::__ReadFileEntry (void) { FileEntry *fe = NULL; if (!m_fp && (this->m_hFile == INVALID_HANDLE_VALUE)) return false; /// 파일 앞으로 이동 long lMaxOffset = 0; if(m_hFile != INVALID_HANDLE_VALUE) // Memory Mapped IO 가 아니면 파일의 크기를 조사한다 lMaxOffset = __fseek (m_fp, 0, SEEK_END); fseek (m_fpFAT, m_lEntryStart, SEEK_SET); fread ((void *)&m_dwNum , sizeof (DWORD), 1, m_fpFAT); /// 갯수를 읽는다 fread ((void *)&m_dwDelCnt , sizeof (DWORD), 1, m_fpFAT); /// 삭제항목의 갯수를 읽는다 fread ((void *)&m_lStartOffset , sizeof (long) , 1, m_fpFAT); /// vfs파일에서 데이터의 시작 // 값 체크 if( m_dwNum > CGlobalData::FILEENTRY_MAX_COUNT || m_dwNum < 0 || m_dwDelCnt > CGlobalData::FILEENTRY_MAX_COUNT || m_dwDelCnt < 0 ) return false; // Memory Mapped IO 가 아니면 범위를 체크한다 if(m_hFile != INVALID_HANDLE_VALUE && m_lStartOffset > lMaxOffset ) return false; for(unsigned int i = 0; i < m_dwNum; i++) { if((fe = new FileEntry)) { if( !VReadFileEntry (fe, m_fpFAT) ) return false; /// 삭제항목이 아니면. if(fe->cDeleted == 0) { m_ve.push_back (fe); /// 이 리스트에는 m_is[ i ] = fe->sFileName; m_si[ fe->sFileName ] = i; } /// 삭제항목이면 삭제항목리스트에 추가 else { /// m_is, m_si맵에 추가하지 않으면 파일엔트리에 접근할수 없다. /// 하지만 vector에는 추가해 놓는다. 나중에 재사용되는 경우를 위해서 m_ve.push_back (fe); /// 이 리스트에는 m_mapDel[ i ] = fe; } } else return false; } return true; }
/*------------------------------------------- | Name:rewind | Description: | Parameters: | Return Type: | Comments: | See: ---------------------------------------------*/ void __rewind(FILE * fp){ __thr_safe_lock(fp); __fseek(fp, (long)0, 0); clearerr(fp); __thr_safe_unlock(fp); }