Pcx_IS_VALID_FILE.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:2k
源码类别:

图形图象

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "PcxDeclare.h"
  3. #include "PcxModule.h"
  4. BOOL IsFileExist(char *lpFileName)
  5. {
  6. CFile file;
  7. BOOL bExist = FALSE; // 文件存在是TRUE,不存在是FALSE
  8. CFileException e;
  9. // 确定指定的文件是否存在
  10. if (file.Open(lpFileName, CFile::modeReadWrite|CFile::shareDenyNone, &e))
  11. {
  12. bExist = TRUE;
  13. file.Close();
  14. }
  15. else
  16. {
  17. // 可能有其他程序正在处理此文件
  18. switch(e.m_cause)
  19. {
  20. case CFileException::tooManyOpenFiles:
  21. case CFileException::accessDenied:
  22. case CFileException::sharingViolation:
  23. case CFileException::lockViolation:
  24. return TRUE;
  25. case CFileException::fileNotFound:
  26. case CFileException::badPath:
  27. case CFileException::invalidFile:
  28. case CFileException::hardIO:
  29. default:
  30. return FALSE;
  31. }
  32. }
  33. return bExist;
  34. }
  35. void Pcx_IS_VALID_FILE(INFOSTR *pInfo)
  36. {
  37. CFile file;
  38. PCXFILEHEADER PcxHeader;
  39. DWORD dwSize;
  40. UINT uRet;
  41. ASSERT(pInfo);
  42. // 检验入口参数是否符合接口定义
  43. ASSERT(pInfo->result == ER_EMPTY);
  44. ASSERT(pInfo->annexdata.iAnnData == 0);
  45. ASSERT(::strlen(pInfo->filename));
  46. ASSERT(pInfo->state == PKST_NOTVER);
  47. // 设初值
  48. pInfo->result = ER_SUCCESS;
  49. pInfo->annexdata.iAnnData = 0;
  50. // 先判断指定的文件是否存在
  51. if (!IsFileExist(pInfo->filename))
  52. pInfo->result = ER_COMMINFOERR;
  53. else
  54. {
  55. // 打开指定文件
  56. if (!file.Open(pInfo->filename, CFile::modeRead))
  57. {
  58. pInfo->result = ER_FILERWERR; // 打开文件时出错
  59. return;
  60. }
  61. // 获取PCX文件的长度(以字节为单位)
  62. dwSize = file.GetLength();
  63. // 用长度判断
  64. if (dwSize < (sizeof(PcxHeader) ))
  65. {
  66. // 这不是一个文件,PCX文件的长度起码大于Pcx文件头长度
  67. file.Close();
  68. return;
  69. }
  70. // 读取Pcx的文件头及信息头结构,并检查它们的有效性
  71. // 检查Pcx标志
  72. file.SeekToBegin();
  73. uRet  = file.Read((LPSTR)&PcxHeader, sizeof(PcxHeader));
  74. if ( (uRet != sizeof(PcxHeader)) )
  75. {
  76. pInfo->result = ER_FILERWERR; // 读文件时出错
  77. file.Close();
  78. return;
  79. }
  80. // 判断Pcx文件头部的标志
  81. if (PcxHeader.byManufacturer != PCX_FILE_FLAG)
  82. {
  83. file.Close();
  84. return;
  85. }
  86. // 判断文件的尺寸
  87. // 到此,大致可以表明该文件是一个有效的PCX文件,iAnnData变量设为1
  88. pInfo->annexdata.iAnnData = 1;
  89. pInfo->state = PKST_PASSVER; // 表示通过校验
  90. file.Close();
  91. }//else
  92. }