본문 바로가기

PROGRAMMING

C / C++ 콘솔모드에서 폴더탐색 v1.1

ytlee64 | naver http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10104&eid=QQR7Hp2tCmrNrRKcw4dnnk+4FbHYPN3O&qb=YysrILXwt7rF5Liu

CFile Members from MSDN http://msdn.microsoft.com/ko-kr/library/3d65ch27.aspx 
====================================================================================
콘솔에서 폴더를 탐색하길 원할떄 사용..
MFC를 사용하기 위해 afx.h를 include 한다.

아래 소스는 단순히 현재 폴더내용만 보일 뿐이다(디렉토리)
디렉토리 목록에
.
..
가 포함되는건 NG...


#include < afx.h >
#include <iostream>

using namespace std;

void main( void )

{
   CFileFind finder;

   BOOL bWorking = finder.FindFile("C:\\*");
   while (bWorking)
   {   
    bWorking = finder.FindNextFile();

    if(finder.IsDirectory())
        cout << (LPCTSTR) finder.GetFileName() << endl;
   }
}


위에서 폴더만 나오게 개조? 하위 폴더까지 나오게 하면 아래와 같이 된다.

#include < afx.h >
#include <iostream>

using namespace std;

int cnt = 20;
void print(CString input)
{
 CFileFind finder;

    BOOL bWorking = finder.FindFile(input);

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

        if(finder.IsDirectory() && !finder.IsDots())
  {
   //print dir name
   cout << (LPCTSTR) finder.GetFileName() << endl; 

   //remove * mark
   input.Delete(input.GetLength()-1);
   //add dir name and \\*
   input = input + (LPCTSTR) finder.GetFileName() + "\\*";
   print(input);
   
  }
    }
}

void main( void )
{
 CString path = "c:\\samp\\*";
 print(path);
}


파일 경로가 c:\\abc\\*   이런식이라
재귀로 탐색해 내려가기 위해서는 끝의 * 를 제거할 필요가 있었다.

때문에 CString.Delete(int index) 를 사용하였고 해당하는 위치가 마지막 위치였기에
CString.Delete(CString.GetLength()-1) 와 같이 사용하였다.
포지션은 0기준으로 인덱싱되고 GetLength의 리턴값은 사람이 인지하는 숫자세기인 까닭에 1차이가 난다.
(한마디로 1 빼야된단 소리)

CFileFind.GetFileName() 으로 이름을 받아왔다.
추가로 ~.IsDots() 메소드가 있으니 사용하길...   
폴더 출력중의...
.
..
를 제거 할 수가 있다.

저 메소드 몰라 삽질을... (모르면 고생이란 말이 맞는 듯 하다)

*** 앞에 (LPCTSTR) 의 의미는 따로 알아볼 필요가 있을듯