본문 바로가기
C & C++/C & C++

CFileFind 사용법

by izen8 2012. 8. 22.
반응형

변수/함수 선언.

void SearchFolder(int &nItem, CString filename);
CFileFindDlg(CWnd* pParent = NULL); // standard constructor
bool m_bStop;
CImageList m_img;
CString m_strToken;
BOOL m_bResult;

 


enum { IDD = IDD_FILEFIND_DIALOG };
CListCtrlEx m_listResult;
CButton m_btn_Serch;
CButton m_btnStart;
BOOL m_bSub;
CString m_strFileLocation;
CString m_strFileName;
CString m_strStatus;

 

초기화 루틴.

//--> 리스트 컨트롤에 이미지 연결.
m_img.Create(IDB_LIST, 16, 2, RGB(255,255,255));
m_listResult.SetImageList(&m_img, LVSIL_SMALL);

//--> 리스트 컨트롤 헤더 설정.
m_listResult.InsertColumn(0, "이름", LVCFMT_LEFT, 160);
m_listResult.InsertColumn(1, "위치", LVCFMT_LEFT, 160);
m_listResult.InsertColumn(2, "크기(byte)", LVCFMT_RIGHT, 90);
m_listResult.InsertColumn(3, "생성날짜", LVCFMT_CENTER, 90);

//--> 현재 폴더 보여주기.
char pBuf[256];
GetCurrentDirectory(256, pBuf);
m_strFileLocation.Format("%s", pBuf);
UpdateData(FALSE);

 

List Control 변수의 파생 클래스( InsertItem(), SetItem() )

int CListCtrlEx::AddItem(LPCTSTR strItem, int nItem, int nSubItem,\
UINT nState, int nImageIndex, long nParam)
{
LVITEM lvItem;
lvItem.mask = LVIF_TEXT;
lvItem.iItem = nItem;
lvItem.iSubItem = nSubItem;
lvItem.pszText = (LPTSTR)strItem;

if( nState != -1 )
{
lvItem.mask |= LVIF_STATE;
lvItem.state = nState;
}
if( nImageIndex != -1 )
{
lvItem.mask |= LVIF_IMAGE;
lvItem.iImage = nImageIndex;
}
if( nParam != -1 )
{
lvItem.mask |= LVIF_PARAM;
lvItem.lParam = nParam;
}
if( nSubItem == 0 )
{
return InsertItem(&lvItem);
}
else
return SetItem(&lvItem);
}

 

다이얼로그에서 검색 버튼 클릭시.

void CFileFindDlg::OnButtonStart()
{
UpdateData(TRUE);

CFileFind finder;

/*******************************************
// strItem = 디스플레이용 텍스트.
// nItem = 아이템 인덱스.
// nSubItem = 서브 아이템 인덱스.
// nState = 상태값.
// nImageIndex = 이미지의 인덱스.
// nParam = 저장할 파라미터.
********************************************/
// LPCTSTR strItem;
int nItem = 0;
int nSubItem = 0;
UINT nState = 0;
int nImageIndex = 0;
// long nParam;

CString str, strFileLocation;
strFileLocation = m_strFileLocation;

int n, i=0;
while (1)
{
n = strFileLocation.Find('\\', i);
if( n < 0 )
break;
strFileLocation.Insert(n, '\\');
i = n+2;
}
strFileLocation += "\\";
strFileLocation += "\\";
strFileLocation += "*.*";

static TCHAR szFileToFind[100];
strcpy( szFileToFind, (LPCTSTR)strFileLocation );
CFileFindEx time;

m_bResult = finder.FindFile(szFileToFind);

while( m_bResult )
{
//--> 다음 파일.
m_bResult = finder.FindNextFile();

CString buf = (LPCTSTR)finder.GetFileName();

//--> 찾는 문자 열이 아니면.
if( buf.Find(m_strFileName) < 0 )
continue;

if( finder.IsDirectory() || finder.IsDots() )
{
//--> 디렉터리일 경우.
nImageIndex = 0;

if( m_bSub )
{
//--> 하위 디렉터리 검색.
SearchFolder(nItem, m_strFileLocation + "\\" + finder.GetFileName());
}
}
else
{
//--> 파일일 경우.
nImageIndex = 1;
}

//--> 포커스를 준다.
nState = LVIS_FOCUSED;

//--> 아이템 등록 및 이름 아이템 등록.
m_listResult.AddItem((LPCTSTR)finder.GetFileName(), nItem, nSubItem++,\
nState, nImageIndex);

//--> root 아이템 등록
nImageIndex = -1;
m_listResult.AddItem((LPCTSTR)finder.GetRoot(), nItem, nSubItem++,\
nState, nImageIndex);

//--> size 아이템 등록
CString str;
str.Format("%d", finder.GetLength());
m_listResult.AddItem((LPCTSTR)str, nItem, nSubItem++,\
nState, nImageIndex);

//--> 생성 날짜 아이템 등록.
m_listResult.AddItem((LPCTSTR)time.GetCreationTimeString(finder), nItem,\
nSubItem++, nState, nImageIndex);

//--> 현재 파일경로.
m_strStatus = finder.GetFilePath();
UpdateData(FALSE);

nItem++;
nSubItem=0;
}
}

 

하위폴더 검색 함수( 재귀가능 )

void CFileFindDlg::SearchFolder(int &nItem, CString filename)
{
CFileFind finder;
CString tmp = filename;

// LPCTSTR strItem;
// int nItem = 0;
int nSubItem = 0;
UINT nState = 0;
int nImageIndex = 0;
// long nParam;

int n, i=0;
while (1)
{
n = filename.Find('\\', i);
if( n < 0 )
break;
filename.Insert(n, '\\');
i = n+2;
}
filename += "\\";
filename += "\\";
filename += "*.*";

static TCHAR szFileToFind[100];
strcpy( szFileToFind, (LPCTSTR)filename );
CFileFindEx time;

m_bResult = finder.FindFile(szFileToFind);

while( m_bResult )
{
m_bResult = finder.FindNextFile();

CString buf = (LPCTSTR)finder.GetFileName();

if( buf.Find(m_strFileName) < 0 )
continue;

if( finder.IsDirectory() || finder.IsDots() )
{
nImageIndex = 0;

if( m_bSub )
{
//--> 하위에서 하위 폴더..(재귀호출)
SearchFolder(nItem, tmp + "\\" + finder.GetFileName());
m_bResult = !m_bResult;
}
}
else
{
nImageIndex = 1;
}

nState = LVIS_FOCUSED;

m_listResult.AddItem((LPCTSTR)finder.GetFileName(), nItem, nSubItem++,\
nState, nImageIndex);

nImageIndex = -1;
m_listResult.AddItem((LPCTSTR)finder.GetRoot(), nItem, nSubItem++,\
nState, nImageIndex);

CString str;
str.Format("%d", finder.GetLength());
m_listResult.AddItem((LPCTSTR)str, nItem, nSubItem++,\
nState, nImageIndex);

m_listResult.AddItem((LPCTSTR)time.GetCreationTimeString(finder), nItem,\
nSubItem++, nState, nImageIndex);

m_strStatus = finder.GetFilePath();
UpdateData(FALSE);

nItem++;
nSubItem=0;
}
m_bResult = !m_bResult;
}

 

반응형

댓글