您的位置:首页 > 其它

遍历文件目录及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的高端和低端),所有转换的时候千万别弄反了,要不然那差别就大勒去了。呵呵

洗洗睡了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: