扫描当前目录并过滤一种文件后缀

最近自己写一个P2P软件研究,所以研究了一下怎么实现目录扫描。
类文件如下:
/************************************************************************

	文件名:ScanFolder.h
	作  者:绝望的老猫
	日  期:2012-08-13
	描  述:扫描文件
************************************************************************/
#ifndef __SCANFOLDER_H__
#define __SCANFOLDER_H__

#include <vector>
#include <Windows.h>

using namespace std;

struct SFileInfo
{
	char name[MAX_PATH];
	char path[MAX_PATH];
};

typedef vector<SFileInfo> TSFileInfoVec;
typedef TSFileInfoVec* PTSFileInfoVec;

class CScanFolder
{
public:
	CScanFolder(const char* path = NULL,const char* filterExt = NULL);
	~CScanFolder();
	PTSFileInfoVec GetFileInfoList();
protected:
private:
	void GetList();
	const char* m_pPath;
	const char* m_pFilterExt;
	int m_iFileTotal;
	TSFileInfoVec m_fileInfoVec;
};
#endif
/************************************************************************
	文件名:ScanFolder.cpp
	作  者:绝望的老猫
	日  期:2012-08-13
	描  述:扫描文件
************************************************************************/

#include "ScanFolder.h"
#include <iostream>
#include "shlwapi.h"

#pragma comment(lib,"Shlwapi.lib")

using namespace std;

//
CScanFolder::CScanFolder(const char* path,const char* filterExt)
{
	m_pPath = path;
	m_pFilterExt = filterExt;
	m_iFileTotal = 0;
}

//
CScanFolder::~CScanFolder()
{
	m_fileInfoVec.clear();
}

//
void CScanFolder::GetList()
{
	HANDLE hSearch = NULL;
	WIN32_FIND_DATA data;
	hSearch = FindFirstFile("*",&data);

	do 
	{
		//属性为目录并且不为"."或".."目录
		if (data.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY
			&&strcmp(data.cFileName,".")
			&&strcmp(data.cFileName,".."))
		{
			SetCurrentDirectory(data.cFileName);
			GetList();
			//返回上级目录
			SetCurrentDirectory("..");
		}
		else
		{
			if (strcmp(data.cFileName,".")&&strcmp(data.cFileName,".."))
			{
				LPSTR extName = PathFindExtension(data.cFileName);

				if (strcmp(extName,m_pFilterExt))
				{
					SFileInfo fileInfo;
					GetCurrentDirectory(MAX_PATH,fileInfo.path);

					memcpy(&fileInfo.name,data.cFileName,MAX_PATH);
					m_fileInfoVec.push_back(fileInfo);
					m_iFileTotal++;
				}
			}
		}
	} while (FindNextFile(hSearch,&data));
	FindClose(hSearch);
}

//
PTSFileInfoVec CScanFolder::GetFileInfoList()
{
	m_fileInfoVec.clear();
	m_iFileTotal = 0;
	SetCurrentDirectory(m_pPath);
	GetList();	
	cout<<"目录下共有"<<m_iFileTotal<<"个文件。"<<endl;
	return &m_fileInfoVec;
}

调用测试:
/************************************************************************
	文件名:main.cpp
	作  者:绝望的老猫
	日  期:2012/08/13
	描  述:测试目录扫描
************************************************************************/
#include "ScanFolder.h"
#include <iostream>

using namespace std;

void main()
{
	CScanFolder* m_pScanFolder = NULL;
	char m_pPath[MAX_PATH];
	GetCurrentDirectory(MAX_PATH,m_pPath);
	PTSFileInfoVec m_pFileInfoVec = NULL;

	m_pScanFolder = new CScanFolder(m_pPath,".txt");

	m_pFileInfoVec = m_pScanFolder->GetFileInfoList();

	if (m_pFileInfoVec == NULL)
		return;

	int iTotal = 0;
	cout<<"扫描制定目录:"<<endl;

	for (TSFileInfoVec::const_iterator it = m_pFileInfoVec->begin();it!=m_pFileInfoVec->end();++it)
	{
		cout<<"["<<iTotal<<"]"<<it->path<<"\\"<<it->name<<endl;
		iTotal++;
	}

	system("PAUSE");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值