[MFC] 폴더만 탐색 및 xml 데이터 생성
MFC&ActiveX 2008. 8. 21. 02:55 |특정 폴더를 기준으로 하위 폴더를 찾아 내는 코드 입니다.
그리고 그 폴더 내용을 xml 형태로 만들어 주는 코드도 포함되어 있습니다.
xml 데이터로 만들어진 내용은 CEdit 컨트롤에 표시되며, 그 내용을
저장할 수 있습니다.
void CTreeSampleDlg::FindDirectory( CString path )
{
CFileFind finder;
bool bWork = finder.FindFile( ( path + CString("\\*.*") ) );
while ( bWork )
{
bWork = finder.FindNextFile();
if( finder.IsDots() )
continue;
else if( finder.IsDirectory() )
{
CString outputText;
for( int i = 0; i < tabCount; i++ )
{
outputText += CString("\t");
}
outputText += finder.GetFileName();
TRACE( "%s\n", outputText );
tabCount++;
FindDirectory( finder.GetFilePath() );
}
}
tabCount--;
}
// 트리 노드 추가하는 함수
HTREEITEM CTreeSampleDlg::AddTreeItem( HTREEITEM parent, CString nodeName )
{
TVINSERTSTRUCT data;
data.hParent = parent;
data.hInsertAfter = TVI_SORT;
data.item.mask = TVIF_TEXT;
data.item.pszText = (LPSTR)(LPCSTR)nodeName;
return m_Tree.InsertItem( &data );
}
// 하위폴더 검색해서 트리 컨트롤에 추가하는 코드
void CTreeSampleDlg::FindDirectoryToTreeControl( CString path, HTREEITEM parent )
{
CFileFind finder;
bool bWork = finder.FindFile( ( path + CString("\\*.*") ) );
while ( bWork )
{
bWork = finder.FindNextFile();
if( finder.IsDots() )
continue;
else if( finder.IsDirectory() )
{
#if _DEBUG
CString outputText;
for( int i = 0; i < tabCount; i++ )
{
outputText += CString("\t");
}
outputText += finder.GetFileName();
TRACE( "%s\n", outputText );
#endif //
// node 추가
HTREEITEM node = AddTreeItem( parent, finder.GetFileName() );
tabCount++;
FindDirectoryToTreeControl( finder.GetFilePath(), node );
}
}
tabCount--;
}
bool CTreeSampleDlg::SearchTreeNode( HTREEITEM node )
{
#if _DEBUG
CString outputText;
for( int i = 0; i < tabCount; i++ )
{
outputText += CString("\t");
}
outputText += m_Tree.GetItemText( node );
TRACE( "%s\n", outputText );
#endif //
if( m_Tree.ItemHasChildren( node ) )
{
HTREEITEM childNode = m_Tree.GetChildItem( node );
do {
tabCount++;
if( SearchTreeNode( childNode ) )
return 1;
} while( ( childNode = m_Tree.GetNextSiblingItem( childNode ) ) != NULL );
}
tabCount--;
return 0;
}
// 트리 부분을 탐색해서 char* 형태의 버퍼에 담아 줍니다.
bool CTreeSampleDlg::SearchTreeNodeToXML( HTREEITEM node )
{
CString outputText;
HTREEITEM refnode;
for( int i = 0; i < tabCount; i++ )
{
outputText += CString("\t");
}
if( node == NULL )
{
refnode = m_Tree.GetRootItem();
memset( line_data, 0, sizeof(char)*1024 );
sprintf( line_data, "<?xml version=\"1.0\" encoding=\"EUC-KR\"?>\r\n\r\n" );
strcat(total_data,line_data);
memset( line_data, 0, sizeof(char)*1024 );
sprintf( line_data, "<PATHS>\r\n" );
strcat(total_data,line_data);
}
else
{
refnode = node;
memset( line_data, 0, sizeof(char)*1024 );
sprintf( line_data, "%s<PATH name=\"%s\">\r\n", outputText, m_Tree.GetItemText( node ) );
strcat(total_data,line_data);
}
if( m_Tree.ItemHasChildren( refnode ) )
{
HTREEITEM childNode = m_Tree.GetChildItem( refnode );
do {
tabCount++;
if( SearchTreeNodeToXML( childNode ) )
return 1;
} while( ( childNode = m_Tree.GetNextSiblingItem( childNode ) ) != NULL );
}
if( node == NULL )
{
memset( line_data, 0, sizeof(char)*1024 );
sprintf( line_data, "</PATHS>\r\n" );
strcat(total_data,line_data);
}
else
{
memset( line_data, 0, sizeof(char)*1024 );
sprintf( line_data, "%s</PATH>\r\n", outputText, m_Tree.GetItemText( node ) );
strcat(total_data,line_data);
}
tabCount--;
return 0;
}
void CTreeSampleDlg::OnBnClickedButtonXmlsave()
{
UpdateData( true );
CString buf;
m_Edit.GetWindowText( buf );
CFile file;
file.Open( "d:\\test.xml", CFile::modeCreate|CFile::modeWrite );
file.Write( (LPSTR)(LPCSTR)buf, buf.GetLength() );
file.Flush();
file.Close();
AfxMessageBox( "저장 완료" );
}
.