遍历文件目录及bmp位图信息头的读取
2011-12-23 00:08
435 查看
#include<Windows.h> #include <cstdio> #include <tchar.h> #include <cassert> #pragma warning(disable:4996) //-------------------------------------------------------------------------------- // 类名: CFileVisitor // 描叙: 文件访问者基类 //-------------------------------------------------------------------------------- class CFileVisitor { public: CFileVisitor(){}; virtual ~CFileVisitor(){}; virtual void visit(const TCHAR* /*szFilePath*/){}; }; //-------------------------------------------------------------------------------- // 函数: AcceptFile // 功能: 递归遍历指定文件夹下的所有文件 //-------------------------------------------------------------------------------- void AcceptFile(const TCHAR*_szPath,CFileVisitor* visitor) { assert(_szPath); //拷贝路径 TCHAR szPath[MAX_PATH] = TEXT(""); _tcscpy(szPath,_szPath); //修正路径以 *.* 结尾 size_t length = _tcslen(szPath); if(szPath[length-1] != '\\') { szPath[length] = '\\'; szPath[length+1] = '\0'; } _tcscat(szPath,TEXT("*.*")); //查询文件 WIN32_FIND_DATA finddata; ZeroMemory(&finddata,sizeof(WIN32_FIND_DATA)); HANDLE hfile = FindFirstFile(szPath,&finddata); if(hfile != INVALID_HANDLE_VALUE) { length = _tcslen(szPath); szPath[length-3] = '\0'; length = _tcslen(szPath); BOOL ret = TRUE; while(ret) { //windows系统下每个文件夹下有两个名为 .和.. 的默认文件夹 wince下无 if(finddata.cFileName[0] != '.') { //得到文件路径 _tcscat(szPath,finddata.cFileName); //文件夹 if(finddata.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) AcceptFile(szPath,visitor); else visitor->visit(szPath); //复位文件夹路径 szPath[length] = '\0'; } ret = FindNextFile(hfile,&finddata); } } //关闭查询句柄 FindClose(hfile); } //-------------------------------------------------------------------------------- // 类名: CBmpFileVisitor // 描叙: 文件访问者类 //-------------------------------------------------------------------------------- class CBmpFileVisitor:public CFileVisitor { public: CBmpFileVisitor():m_icount(0){}; ~CBmpFileVisitor(){}; virtual void visit(const TCHAR* szFilePath); private: //文件是否bmp格式 bool isBmpFile(const TCHAR* szFilePath,const TCHAR* szFix=TEXT("bmp")); //是否符合要求的bmp图片 bool isBmpOk(const TCHAR* szFilePath); public: unsigned int m_icount; }; bool CBmpFileVisitor::isBmpFile(const TCHAR* szFilePath,const TCHAR* szFix) { TCHAR szPath[MAX_PATH] = TEXT(""); _tcscpy(szPath,szFilePath); //得到文件名 TCHAR* pName = _tcsrchr(szPath,'\\'); if(pName) { TCHAR* p = _tcsrchr(pName,'.'); if(p) { p++;//得到后缀 if(_tcsicmp(p,szFix) == 0) return true; } } return false; } bool CBmpFileVisitor::isBmpOk(const TCHAR* szFilePath) { bool re = false; //打开文件 FILE* pfile = _tfopen(szFilePath,TEXT("r")); if(pfile) { fseek(pfile,sizeof(BITMAPFILEHEADER),0); const size_t size = sizeof(BITMAPINFOHEADER); BITMAPINFOHEADER infohead; ZeroMemory(&infohead,size); //读取bmp文件信息头 const size_t rednum = fread(&infohead,sizeof(char),size,pfile); if(rednum == size) { // 640*480*8 的bmp图片 if(infohead.biWidth==640&&infohead.biHeight==480&&infohead.biBitCount==8) re = true; } fflush(pfile); fclose(pfile); } return re; } void CBmpFileVisitor::visit(const TCHAR *szFilePath) { if(isBmpFile(szFilePath)) { if(isBmpOk(szFilePath)) { m_icount++; OutputDebugString(szFilePath); } } } void main() { CBmpFileVisitor pVisitor; AcceptFile(TEXT("E:\\"),&pVisitor); printf("%d",pVisitor.m_icount); }
上面代码在本人的windows x86上运行通过。
其实像png,jpg等其他图片,只需要知道文件头的格式同样便可以很容易的读取信息头。值得注意的是,fread的时候可以自定义一个结构体去框数据,但自定义buffer去接收的话,buffer中收到的字节是反着存储的(这里牵涉到os的高端和低端),所有转换的时候千万别弄反了,要不然那差别就大勒去了。呵呵
洗洗睡了!
相关文章推荐
- proc文件系统_每进程信息形成原理、目录遍历方式、位图查找
- 读取BMP文件中关于位图属性的信息,将一个数值矩阵封装为一个BMP格式的文件
- 使用linux c 目录操作函数,读取任一目录下的所有目录信息文件信息
- Linux操作系统中读取目录文件信息的过程分析
- C#怎么遍历目录读取图片类型的文件啊
- C#遍历文件夹, 获取文件/目录信息
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)
- PHP遍历指定目录,并存储目录内所有文件属性信息
- php 读取目录所有文件信息dir()
- C# 打开文件目录并读取整个目录信息
- php 读取目录所有文件信息dir()
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)
- 有感于滥用多线程之遍历文件目录信息
- 遍历指定目录,并存储目录内所有文件属性信息的php代码
- Asp.Net_文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)
- php读取目录所有文件信息dir示例
- MFC中怎样读取一个JPG文件或BMP位图文件
- 遍历目录和文件信息
- Java文件操作之按行读取文件和遍历目录的方法