最近自己写一个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");
}