차근차근/C
하위폴더 검색 및 파일명 출력 진행중
하위폴더 검색 및 파일명 출력
//http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=433324&ref=433291
//릴리즈 모드에서 실행해야함.
#include <afxwin.h>
#include <iostream>
#include <vector>
#include <locale> //wcout
#ifdef _UNICODE
#define tcout wcout
#else
#define tcout cout
#endif
using namespace std;
void Recurse(LPCTSTR pstr)
{
wcout.imbue(locale("kor"));
wcout << "1.pstr => "<< pstr<< endl;
wcout << "2.Recurse(LPCTSTR pstr) => "<< (LPCTSTR) pstr<< endl;
CFileFind finder;
CString strFolderItem , strFileExt;
std::vector<CString> m_sCopyList;
// build a string with wildcards
//와일드 카드 문자열을 구축
CString strWildcard(pstr);
wcout << "3.CString strWildcard(pstr) => "<< (LPCTSTR)strWildcard << endl;
strWildcard += _T("\\*.*");
wcout << "4.strWildcard => "<< (LPCTSTR)strWildcard << endl;
// start working for files
//파일에 대한 작업을 시작
BOOL bWorking = finder.FindFile(strWildcard);
wcout << "5.bWorking => "<< bWorking << endl;
while (bWorking)
{
bWorking = finder.FindNextFile();
wcout << "a.while문 bWorking => "<< bWorking << endl;
//http://mynotepad.tistory.com/50소스
if(finder.IsDirectory() && !finder.IsDots())
// 디렉토리 발견시
{
strFolderItem = finder.GetFilePath();
Recurse(strFolderItem);
cout << "b.디렉토리 발견시 => "<< (LPCTSTR)strFolderItem << endl;
wcout << "c.디렉토리 발견시 => "<< finder.IsDots() << endl;
// 하위폴더를 검색하기 위해 재귀호출 발생
}
strFolderItem = finder.GetFilePath();
strFileExt = strFolderItem.Mid(strFolderItem.ReverseFind('.'));
wcout << "가.strFolderItem => "<< (LPCTSTR)strFolderItem << endl;
wcout << "나.strFileExt => "<< (LPCTSTR)strFileExt << endl;
wcout << "다.finder.IsDots() => "<< finder.IsDots() << endl;
// 확장자만 추출한다.
if (!finder.IsDots())
// 파일 탐색 필터 정의에따라 해당 StringList에 추가
{
strFileExt.MakeUpper();
// strFileExt 에는 확장자 (.EXE 형태) 가 들어옴. 비교위해 대문자화 함
if( finder.IsDirectory() ) continue;
// 폴더만 남는 경우는 넣으면 안됨
m_sCopyList.push_back(strFolderItem);
wcout << "라.strFolderItem => "<< (LPCTSTR)strFolderItem << endl;
}
// // skip . and .. files; otherwise, we'd
// // recur infinitely!
// //무한 반복!
// if (finder.IsDots()){
// cout << "finder.IsDots() => "<< finder.IsDots() << endl;
// continue;
//}
// // if it's a directory, recursively search it
////이 디렉토리의 경우, 재귀검색
// if (finder.IsDirectory())
// {
// cout << "finder.IsDirectory() => "<< finder.IsDirectory() << endl;
// CString str = finder.GetFilePath();
// cout <<"(LPCTSTR) str => "<< (LPCTSTR) str << endl;
// Recurse(str);
// }
}
finder.Close();
}
void main()
{
if (!AfxWinInit(GetModuleHandle(NULL), NULL, GetCommandLine(), 0))
wcout << "panic!" << endl;
else{
wcout << "start!" << endl;
Recurse(_T("C:/파일경로/test2"));
}
}
//어떻게 해야 파일명이 나오지..
1차 출력 - http://jinha-world.blogspot.kr/2010/04/c-wcout.html 내용추가함 -> 한글출력 됨
(폴더 경로 아래 이미지 파일 2개있음)
start!
1.pstr => C:/파일경로/test2
2.Recurse(LPCTSTR pstr) =>C:/파일경로/test2
3.CString strWildcard(pstr) => C:/파일경로/test2
4.strWildcard => C:/파일경로/test2\*.*
5.bWorking => 1
a.while bWorking => 1
.strFolderItem => C:파일경로\test2\.
.strFileExt => .
.finder.IsDots() => 1
a.while bWorking => 1
.strFolderItem => C:/파일경로/test2\..
.strFileExt => .
.finder.IsDots() => 1
a.while bWorking => 1
.strFolderItem => C:/파일경로/test2\가새뽕나무_1.jpg
.strFileExt => .jpg
.finder.IsDots() => 0
.strFolderItem => C:/파일경로/test2\가새뽕나무_1.jpg
a.while bWorking => 0
.strFolderItem => C:/파일경로/test2\가새뽕나무_2.jpg
.strFileExt => .jpg
.finder.IsDots() => 0
.strFolderItem => C:/파일경로/test2\가새뽕나무_2.jpg
계속하려면 아무 키나 누르십시오 . . .
//http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=433324&ref=433291
//릴리즈 모드에서 실행해야함.
#include <afxwin.h>
#include <iostream>
#include <vector>
#include <locale> //wcout 유니코드 한글 출력
//wcout 유니코드 한글 출력
#ifdef _UNICODE
#define tcout wcout
#else
#define tcout cout
#endif
using namespace std;
void Recurse(LPCTSTR pstr)
{
wcout.imbue(locale("kor")); //wcout 유니코드 한글 출력
wcout << "1.pstr => "<< pstr<< endl;
wcout << "2.Recurse(LPCTSTR pstr) => "<< (LPCTSTR) pstr<< endl;
CFileFind finder;
CString strFolderItem , strFileExt;
CString name ;
std::vector<CString> m_sCopyList;
// build a string with wildcards
//와일드 카드 문자열을 구축
CString strWildcard(pstr);
wcout << "3.CString strWildcard(pstr) => "<< (LPCTSTR)strWildcard << endl;
strWildcard += _T("/*.*");
// == strWildcard += _T("\\*.*");
wcout << "4.strWildcard => "<< (LPCTSTR)strWildcard << endl;
// start working for files
//파일에 대한 작업을 시작
BOOL bWorking = finder.FindFile(strWildcard);
//strWildcard에 파일이 있느냐? 있으면 bWorking = "1"출력
wcout << "5.bWorking => "<< bWorking << endl;
while (bWorking)
{
bWorking = finder.FindNextFile();
wcout << "a.while문 bWorking => "<< bWorking << endl;
//http://mynotepad.tistory.com/50 소스
if(finder.IsDirectory() && !finder.IsDots())
// 디렉토리 발견시
{
strFolderItem = finder.GetFilePath();
Recurse(strFolderItem);
wcout << "b.디렉토리 발견시 => "<< (LPCTSTR)strFolderItem << endl;
wcout << "c.디렉토리 발견시 => "<< finder.IsDots() << endl;
// 하위폴더를 검색하기 위해 재귀호출 발생
}
strFolderItem = finder.GetFilePath(); //GetFilePath 찾은 파일의 전체 경로
strFileExt = strFolderItem.Mid(strFolderItem.ReverseFind('.'));
wcout << "*^^.strFolderItem => "<< (LPCTSTR)strFolderItem << endl;//찾은 파일의 전체 경로
wcout << "**^^.strFileExt => "<< (LPCTSTR)strFileExt << endl;// 확장자만 추출한다.
wcout << "***^^.finder.IsDots() => "<< finder.IsDots() << endl;//IsDots() - 하위폴더 있으면 1, 없으면 0 ??
name = strFolderItem.Right(strFolderItem.GetLength() - strFolderItem.ReverseFind('\\')-1);
wcout << "****^^.name => "<< (LPCTSTR)name << endl;//파일명만 추출
if (!finder.IsDots())
// continue; <- 이거 추가하면 파일명 반복은 안함. 근데 빈폴더도 출력함
// 파일 탐색 필터 정의에따라 해당 StringList에 추가
//IsDots = . ..을 나타내는 실제 디렉토리 (파일인지 아닌지)
{
strFileExt.MakeUpper();
// strFileExt 에는 확장자 (.EXE 형태) 가 들어옴. 비교위해 대문자화 함
if( finder.IsDirectory() ) continue;
// 폴더만 남는 경우는 넣으면 안됨
m_sCopyList.push_back(strFolderItem);
wcout << "*****^^.strFolderItem => "<< (LPCTSTR)strFolderItem << endl;
//wcout << "*****^^m_sCopyList =>" << (int) m_sCopyList.size() << " numbers" << endl;
wcout << "--------- m_sCopyList["<< (int) m_sCopyList.size() <<"] print----------" <<endl;
for(int i=0;i<(int)m_sCopyList.size();i++){
wcout<<(LPCTSTR)m_sCopyList[i]<<" "; //출력
}
wcout<<endl;
}
}
finder.Close();
}
void main()
{
if (!AfxWinInit(GetModuleHandle(NULL), NULL, GetCommandLine(), 0))
wcout << "panic!" << endl;
else{
wcout << "start!" << endl;
Recurse(_T("C:/파일경로/test2"));
}
}
출력2 - 이미지 파일 2 , 폴더1(이미지 파일3),폴더2
m_sCopyList를 하나로 합치기해야함
start!
1.pstr => C:/파일경로/test2
2.Recurse(LPCTSTR pstr) => C:/파일경로/test2
3.CString strWildcard(pstr) => C:/파일경로/test2
4.strWildcard => C:/파일경로/test2/*.*
5.bWorking => 1
a.while bWorking => 1
*^^.strFolderItem => C:/파일경로/test2\.
**^^.strFileExt => .
***^^.finder.IsDots() => 1
****^^.name => .
a.while bWorking => 1
*^^.strFolderItem => C:/파일경로/test2\..
**^^.strFileExt => .
***^^.finder.IsDots() => 1
****^^.name => ..
a.while bWorking => 1
*^^.strFolderItem => C:/파일경로/test2\가새뽕나무_1.jpg
**^^.strFileExt => .jpg
***^^.finder.IsDots() => 0
****^^.name => 가새뽕나무_1.jpg
*****^^.strFolderItem => C:/파일경로/test2\가새뽕나무_1.jpg
--------- m_sCopyList[1] print----------
C:/파일경로/test2\가새뽕나무_1.jpg
a.while bWorking => 1
*^^.strFolderItem => C:/파일경로/test2\가새뽕나무_2.jpg
**^^.strFileExt => .jpg
***^^.finder.IsDots() => 0
****^^.name => 가새뽕나무_2.jpg
*****^^.strFolderItem => C:/파일경로/test2\가새뽕나무_2.jpg
--------- m_sCopyList[2] print----------
C:/파일경로/test2\가새뽕나무_1.jpg C:/파일경로/test2\가새뽕나무_2.jpg
a.while bWorking => 1
1.pstr => C:/파일경로/test2\개개비
2.Recurse(LPCTSTR pstr) => C:/파일경로/test2\개개비
3.CString strWildcard(pstr) => C:/파일경로/test2\개개비
4.strWildcard => C:/파일경로/test2\개개비/*.*
5.bWorking => 1
a.while bWorking => 1
*^^.strFolderItem => C:/파일경로/test2\개개비\.
**^^.strFileExt => .
***^^.finder.IsDots() => 1
****^^.name => .
a.while bWorking => 1
*^^.strFolderItem => C:/파일경로/test2\개개비\..
**^^.strFileExt => .
***^^.finder.IsDots() => 1
****^^.name => ..
a.while bWorking => 1
*^^.strFolderItem => C:/파일경로/test2\개개비\비가오려나.jpg
**^^.strFileExt => .jpg
***^^.finder.IsDots() => 0
****^^.name => 비가오려나.jpg
*****^^.strFolderItem => C:/파일경로/test2\개개비\비가오려나.jp
g
--------- m_sCopyList[1] print----------
C:/파일경로/test2\개개비\비가오려나.jpg
a.while bWorking => 1
*^^.strFolderItem => C:/파일경로/test2\개개비\아이고.jpg
**^^.strFileExt => .jpg
***^^.finder.IsDots() => 0
****^^.name => 아이고.jpg
*****^^.strFolderItem => C:/파일경로/test2\개개비\아이고.jpg
--------- m_sCopyList[2] print----------
C:/파일경로/test2\개개비\비가오려나.jpg C:/파일경로/test2\개개비\아이고.jpg
a.while bWorking => 0
*^^.strFolderItem => C:/파일경로/test2\개개비\연필.jpg
**^^.strFileExt => .jpg
***^^.finder.IsDots() => 0
****^^.name => 연필.jpg
*****^^.strFolderItem => C:/파일경로/test2\개개비\연필.jpg
--------- m_sCopyList[3] print----------
C:/파일경로/test2\개개비\비가오려나.jpg C:/파일경로/test2\개개비\아이고.jpg C:/파일경로/test2\개개비\연필.jpg
b. => C:/파일경로/test2\개개비
c. => 0
*^^.strFolderItem => C:/파일경로/test2\개개비
**^^.strFileExt => C:/파일경로/test2\개개비
***^^.finder.IsDots() => 0
****^^.name => 개개비
a.while bWorking => 0
1.pstr => C:/파일경로/test2\빈폴더
2.Recurse(LPCTSTR pstr) => C:/파일경로/test2\빈폴더
3.CString strWildcard(pstr) => C:/파일경로/test2\빈폴더
4.strWildcard => C:/파일경로/test2\빈폴더/*.*
5.bWorking => 1
a.while bWorking => 1
*^^.strFolderItem => C:/파일경로/test2\빈폴더\.
**^^.strFileExt => .
***^^.finder.IsDots() => 1
****^^.name => .
a.while bWorking => 0
*^^.strFolderItem => C:/파일경로/test2\빈폴더\..
**^^.strFileExt => .
***^^.finder.IsDots() => 1
****^^.name => ..
b. => C:/파일경로/test2\빈폴더
c. => 0
*^^.strFolderItem => C:/파일경로/test2\빈폴더
**^^.strFileExt => C:/파일경로/test2\빈폴더
***^^.finder.IsDots() => 0
****^^.name => 빈폴더
계속하려면 아무 키나 누르십시오 . . .
'차근차근 > C' 카테고리의 다른 글
#error : WINDOWS.H already included. MFC apps must not #include <windows.h> (0) | 2014.11.26 |
---|---|
전체파일 경로에서 파일명만 추출하기 (0) | 2014.11.25 |
[C++] wcout 한글 출력 (0) | 2014.11.25 |
wprintf, wcout등에 unicode빌드시 한글이 안나오는 문제 (0) | 2014.11.25 |
cout의 모든 것 . [setf() , 조정자 , 형식변환] (0) | 2014.11.25 |