在做一個東西時需要掃描目錄下所有圖片,于是就產生了如下的東西
給定速要掃描的路徑,則以其為根目錄掃描其下所有目錄和文件,并且還可以設定掃描的深度
P.S.:
1. 掃描是遞歸實現的,所以缺點很明顯。
2. 在掃描過程中會用到用戶指定的回調函數,并且會將文件類型和名字一并傳入,以便用戶自行決定是否需要將其添加到tree控件中。

頭文件
#include <functional>

class CFolderScanner


{
private:
CTreeCtrl *pTreeCtrl;
CList<HTREEITEM , HTREEITEM> FolderRootStack;

public:
CFolderScanner(void);
~CFolderScanner(void);

void SetTree(CTreeCtrl *pTree);
CTreeCtrl* GetTreeCtrl();

// 在指定的根目錄下掃描文件和文件夾,并將掃描到的名字和類型傳入回調函數中.同時第二個參數指定掃描文件夾的深度.
// 回調函數返回值:
// 0 : 添加當前項,如果是文件夾則不繼續深入掃描
// 1 : 添加當前項,如果是文件夾則繼續深入掃描
// -1 : 不要當前項,如果是文件夾則自然不會深入
void ScanFolder(LPCTSTR RootFolder , int Level , std::tr1::function<int (bool , CString& , int)> CallBack_);

void GetFileList(LPCTSTR FolderPath , CArray<CString , CString&> FileArray);
CString GetPath(HTREEITEM hItem , LPCTSTR separator = NULL);
};

實現
#include "StdAfx.h"
#include "FolderScanner.h"

CFolderScanner::CFolderScanner(void)


{
pTreeCtrl = NULL;
}

CFolderScanner::~CFolderScanner(void)


{
}

void CFolderScanner::SetTree( CTreeCtrl *pTree )


{
pTreeCtrl = pTree;
}

CTreeCtrl* CFolderScanner::GetTreeCtrl()


{
return pTreeCtrl;
}

void CFolderScanner::ScanFolder( LPCTSTR RootFolder , int Level , std::tr1::function<int (bool , CString& , int)> CallBack_ )


{
ASSERT(pTreeCtrl);

CFileFind file;
CString FolderPath(RootFolder);
int i = file.FindFile(FolderPath+_T("\\*.*"));

if(FolderPath.Right(1) != _T("\\"))
FolderPath += L"\\";

bool isFolder = false;
CString Name;
bool isLastOne = false;
HTREEITEM Root_tmp;

while (1)

{
if (!file.FindNextFile())
isLastOne = true;

if (file.IsDots())

{
if (isLastOne)
break;
else
continue;
}

if (file.IsDirectory())

{
isFolder = true;
Name = file.GetFileName();
}
else

{
isFolder = false;
Name = file.GetFileName();
}

int ReVal = CallBack_(isFolder , Name , Level);

if (-1 != ReVal)

{
if (!FolderRootStack.GetCount())
Root_tmp = NULL;
else
Root_tmp = FolderRootStack.GetHead();

Root_tmp = pTreeCtrl->InsertItem(Name , 0 , 0 , Root_tmp);

if (1 == ReVal && (1 < Level || -1 == Level))

{
FolderRootStack.AddHead(Root_tmp);

ScanFolder(FolderPath + Name ,(-1 == Level)? -1 : Level - 1 , CallBack_); // 深入遍歷子目錄
}
}

if (isLastOne)
break;
}

if (FolderRootStack.GetCount())
FolderRootStack.RemoveHead();
}

void CFolderScanner::GetFileList( LPCTSTR FolderPath , CArray<CString , CString&> FileArray )


{
CFileFind fileFind;
CString Path(FolderPath);

bool OK = fileFind.FindFile(Path+_T("\\*.*"));
while (OK)

{
if (!fileFind.FindNextFile())
OK = false;

if (!fileFind.IsDots() && !fileFind.IsDirectory())

{
FileArray.Add(fileFind.GetFilePath());
}
}
}


CString CFolderScanner::GetPath( HTREEITEM hItem , LPCTSTR separator /**//*= NULL*/ )


{
CString ReturnVal = pTreeCtrl->GetItemText(hItem);

while(hItem = pTreeCtrl->GetParentItem(hItem))

{
ReturnVal = pTreeCtrl->GetItemText(hItem) + (separator ? separator : _T("\\")) + ReturnVal;
}

return ReturnVal;
}
posted on 2011-01-09 20:44
zhaoyg 閱讀(808)
評論(0) 編輯 收藏 引用 所屬分類:
MFC學習筆記