示例#1
0
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);
}