나의질문답

하위폴더 검색시 파일명이 출력됐으면 합니다.

예쁜꽃이피었으면 2014. 11. 25. 09:36

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=946519&ref=946519&page=1


안녕하세요.

하위폴더를 검색하여 폴더안의 파일명까지 출력을 하려고 합니다.

여차저차해서 실행이 되는 소스가 있긴한데

경로와 파일명이 출력됐으면 싶은데 (c:/..../파일.jpg)

0076C988이런식의 숫자가 출력됩니다.

이게 뭔지 궁금하고 어디를 수정해야 하나요?


소스 첨부해드립니다.

#include <afxwin.h>
#include <iostream>
#include <vector> 
 
using namespace std;
 
void Recurse(LPCTSTR pstr)
{
cout << "1.pstr => "<< pstr<< endl;
cout << "2.Recurse(LPCTSTR pstr) => "<< Recurse<< endl;
   CFileFind finder;
   CString strFolderItem , strFileExt;
   std::vector<CString> m_sCopyList;
   // build a string with wildcards
   //와일드 카드 문자열을 구축
   CString strWildcard(pstr);
   cout << "3.CString strWildcard(pstr) => "<< strWildcard << endl;
   strWildcard += _T("\\*.*");
   cout << "4.strWildcard => "<< strWildcard << endl;
 
   // start working for files
   //파일에 대한 작업을 시작
   BOOL bWorking = finder.FindFile(strWildcard);
   cout << "5.bWorking => "<< bWorking << endl;
 
   while (bWorking)
   {
      bWorking = finder.FindNextFile();
  cout << "a.while문 bWorking => "<< bWorking << endl;
 
  //http://mynotepad.tistory.com/50소스
  if(finder.IsDirectory() && !finder.IsDots())
// 디렉토리 발견시 
{  
strFolderItem = finder.GetFilePath();  
Recurse(strFolderItem);
cout << "b.디렉토리 발견시 => "<< strFolderItem << endl;
cout << "c.디렉토리 발견시 => "<< finder.IsDots() << endl;
// 하위폴더를 검색하기 위해 재귀호출 발생  
  strFolderItem = finder.GetFilePath();  
strFileExt = strFolderItem.Mid(strFolderItem.ReverseFind('.'));
cout << "가.strFolderItem => "<< strFolderItem << endl;
cout << "나.strFileExt => "<< strFileExt << endl;
cout << "다.finder.IsDots() => "<< finder.IsDots() << endl;
// 확장자만 추출한다. 
 
if (!finder.IsDots())
// 파일 탐색 필터 정의에따라 해당 StringList에 추가
{  
strFileExt.MakeUpper();
// strFileExt 에는 확장자 (.EXE 형태) 가 들어옴. 비교위해 대문자화 함
if( finder.IsDirectory() ) continue;
// 폴더만 남는 경우는 넣으면 안됨 
m_sCopyList.push_back(strFolderItem); 
cout << "라.strFolderItem => "<< strFolderItem << endl;
   }
 
   finder.Close();
}
 
void main()
{
   if (!AfxWinInit(GetModuleHandle(NULL), NULL, GetCommandLine(), 0))
      cout << "panic!" << endl;
   else{
cout << "start!" << endl;
      //Recurse(_T("C:/Users/hyunok/Desktop/호연/식물이미지/이미지2차크기줄이기/test/test2"));
Recurse(_T("이미지폴더경로"));
   }
}

 


폴더안에 이미지 파일이 2개 있을 경우에 실행결과입니다.

start!
1.pstr => 01034480
2.Recurse(LPCTSTR pstr) => 01031000
3.CString strWildcard(pstr) => 0076C908
4.strWildcard => 0076C908
5.bWorking => 1
a.while문 bWorking => 1
가.strFolderItem => 0076C988
나.strFileExt => 0076C430
다.finder.IsDots() => 1
a.while문 bWorking => 1
가.strFolderItem => 0076D5D0
나.strFileExt => 0076C630
다.finder.IsDots() => 1
a.while문 bWorking => 1
가.strFolderItem => 0076D630
나.strFileExt => 00769498
다.finder.IsDots() => 0
라.strFolderItem => 0076D630
a.while문 bWorking => 0
가.strFolderItem => 0076D6A8
나.strFileExt => 007694C0
다.finder.IsDots() => 0
라.strFolderItem => 0076D6A8
계속하려면 아무 키나 누르십시오 . . .




답변1 

1. cout 은 유니코드 문자열을 출력할 수 없으므로 cout -> wcout 으로 변경

 

2. cout/wcout 은 CString 타입 문자열을 출력할 수 없으므로  (LPCTSTR)strWildcard 이런식으로 타입캐스팅해서 출력

 

MFC 클래스인 CString과 C++ 표준 입출력을 함께 사용하는 것은 좋은 아이디어는 아닙니다.

 

표준 입출력을 사용하려면 std::string/std::wstring 을 사용하시는게 나아요.


반응형