- #include "stdafx.h"
- #include "PcxDeclare.h"
- #include "PcxModule.h"
- BOOL IsFileExist(char *lpFileName)
- {
- CFile file;
- BOOL bExist = FALSE; // 文件存在是TRUE,不存在是FALSE
- CFileException e;
- // 确定指定的文件是否存在
- if (file.Open(lpFileName, CFile::modeReadWrite|CFile::shareDenyNone, &e))
- {
- bExist = TRUE;
- file.Close();
- }
- else
- {
- // 可能有其他程序正在处理此文件
- switch(e.m_cause)
- {
- case CFileException::tooManyOpenFiles:
- case CFileException::accessDenied:
- case CFileException::sharingViolation:
- case CFileException::lockViolation:
- return TRUE;
- case CFileException::fileNotFound:
- case CFileException::badPath:
- case CFileException::invalidFile:
- case CFileException::hardIO:
- default:
- return FALSE;
- }
- }
- return bExist;
- }
- void Pcx_IS_VALID_FILE(INFOSTR *pInfo)
- {
- CFile file;
- PCXFILEHEADER PcxHeader;
- DWORD dwSize;
- UINT uRet;
- ASSERT(pInfo);
- // 检验入口参数是否符合接口定义
- ASSERT(pInfo->result == ER_EMPTY);
- ASSERT(pInfo->annexdata.iAnnData == 0);
- ASSERT(::strlen(pInfo->filename));
- ASSERT(pInfo->state == PKST_NOTVER);
- // 设初值
- pInfo->result = ER_SUCCESS;
- pInfo->annexdata.iAnnData = 0;
- // 先判断指定的文件是否存在
- if (!IsFileExist(pInfo->filename))
- pInfo->result = ER_COMMINFOERR;
- else
- {
- // 打开指定文件
- if (!file.Open(pInfo->filename, CFile::modeRead))
- {
- pInfo->result = ER_FILERWERR; // 打开文件时出错
- return;
- }
- // 获取PCX文件的长度(以字节为单位)
- dwSize = file.GetLength();
- // 用长度判断
- if (dwSize < (sizeof(PcxHeader) ))
- {
- // 这不是一个文件,PCX文件的长度起码大于Pcx文件头长度
- file.Close();
- return;
- }
- // 读取Pcx的文件头及信息头结构,并检查它们的有效性
- // 检查Pcx标志
- file.SeekToBegin();
- uRet = file.Read((LPSTR)&PcxHeader, sizeof(PcxHeader));
- if ( (uRet != sizeof(PcxHeader)) )
- {
- pInfo->result = ER_FILERWERR; // 读文件时出错
- file.Close();
- return;
- }
- // 判断Pcx文件头部的标志
- if (PcxHeader.byManufacturer != PCX_FILE_FLAG)
- {
- file.Close();
- return;
- }
- // 判断文件的尺寸
- // 到此,大致可以表明该文件是一个有效的PCX文件,iAnnData变量设为1
- pInfo->annexdata.iAnnData = 1;
- pInfo->state = PKST_PASSVER; // 表示通过校验
- file.Close();
- }//else
- }