http://imagej.tistory.com/75
-------------------------------------------------------------------------------------------------
#include <ctype.h>
#include <io.h>
#include <stdio.h>
#include <iostream>
#include <afxwin.h>
//#include <cstring.h>
#include <atlstr.h>
#include <vector>
using namespace std;
void GetFileList(CString strFolder)
{
CFileFind file;
BOOL b = file.FindFile(strFolder + _T("\\*.*")); // 모든 확장자를 다 사용.
// CString strMusicFilter = ".MP3.OGG.WMA.WAV"; // 필터링 하고 싶으면 이렇게 쓰면 됨
CString strFolderItem, strFileExt, strTempString;
//CString m_sCopyList = _T("");
std::vector<CString> m_sCopyList;
while(b)
{
b = file.FindNextFile();
if(file.IsDirectory() && !file.IsDots()) // 디렉토리 발견시
{
strFolderItem = file.GetFilePath();
GetFileList(strFolderItem); // 하위폴더를 검색하기 위해 재귀호출 발생
}
strFolderItem = file.GetFilePath();
strFileExt = strFolderItem.Mid(strFolderItem.ReverseFind('.')); // 확장자만 추출한다.
if (!file.IsDots()) // 파일 탐색 필터 정의에따라 해당 StringList에 추가
{
strFileExt.MakeUpper(); // strFileExt 에는 확장자 (.EXE 형태) 가 들어옴. 비교위해 대문자화 함
if( file.IsDirectory() ) continue; // 폴더만 남는 경우는 넣으면 안됨
m_sCopyList.push_back(strFolderItem);
}
}
}
폴더의 모든 하위폴더와 파일들 얻어오기
http://mynotepad.tistory.com/50
void GetFileList(CString strFolder) { CFileFind file; BOOL b = file.FindFile(strFolder + _T("\\*.*")); // 모든 확장자를 다 사용. // CString strMusicFilter = ".MP3.OGG.WMA.WAV"; // 필터링 하고 싶으면 이렇게 쓰면 됨 CString strFolderItem, strFileExt, strTempString;
while(b) { b = file.FindNextFile(); if(file.IsDirectory() && !file.IsDots()) // 디렉토리 발견시 { strFolderItem = file.GetFilePath(); GetFileList(strFolderItem); // 하위폴더를 검색하기 위해 재귀호출 발생 } strFolderItem = file.GetFilePath(); strFileExt = strFolderItem.Mid(strFolderItem.ReverseFind('.')); // 확장자만 추출한다.
if (!file.IsDots()) // 파일 탐색 필터 정의에따라 해당 StringList에 추가 { strFileExt.MakeUpper(); // strFileExt 에는 확장자 (.EXE 형태) 가 들어옴. 비교위해 대문자화 함 if( file.IsDirectory() ) continue; // 폴더만 남는 경우는 넣으면 안됨 m_sCopyList.push_back(strFolderItem); } } }
===========> m_sCopyList는 CString 클래스 변수로 m_sCopyList를 선언하면 된다. -------------------------------------------------------------------------------------------------
폴더내 파일 및 폴더 리스트 얻기. 재귀호출.
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=884
-> vcl.h 는 볼랜드 c++빌더에서 쓰는 화일. 비주얼C에선 사용 못함.
델파이나 빌더에서 쓰임
접기
가끔 긁어 쓸 일이 있는 디렉토리내 파일 및 폴더 리스트 얻기입니다.
#include <vcl.h> #pragma hdrstop #include <FileCtrl.hpp> //--------------------------------------------------------------------------- // 지정한 폴더 및 하위 폴더에 대해 모든 파일명을 다 가져온다. // strPath 는 ....\\ 형태이어야 한다. void CMain::GetDirFileName(TStringList *strlstDirNames, String strPath) { TSearchRec sr; try { if(FindFirst(strPath + "*.*", faAnyFile, sr) ==0) { do { // 디렉토리이면 재귀호출 if(sr.Name != "." && sr.Name != ".." && (sr.Attr & faDirectory)) { GetDirFileName(strlstDirNames, strPath + sr.Name + "\\"); } else strlstDirNames->AddObject(strPath + sr.Name, (TObject*) sr.Size); } while(FindNext(sr) == 0); } } __finally { FindClose(sr); } } void GetDirs_And_FileName(TStringList *strlstDirNames, String strPath) { TSearchRec sr; try { if (FindFirst(strPath + "\\*.*", faAnyFile, sr) ==0) { do { // 디렉토리이면 재귀호출 if (sr.Name != "." && sr.Name != ".." && (sr.Attr & faDirectory)) { strlstDirNames->AddObject(strPath + "\\" + sr.Name, (TObject*) 0); // 0은 디렉토리표시. GetDirs_FileName(strlstDirNames, strPath + "\\" + sr.Name); } else if (sr.Name != "." && sr.Name != ".." && sr.Size > 1) strlstDirNames->AddObject(strPath + "\\" + sr.Name, (TObject*) sr.Size); } while(FindNext(sr) == 0); } } __finally { FindClose(sr); } } // 디렉토리 리스트만 얻는다. void CMain::GetDirs(TStringList *strlstDirNames, String strPath) { TSearchRec sr; try { if(FindFirst(strPath + "*.*", faAnyFile, sr) ==0) { do { // 디렉토리이면 재귀호출 if(sr.Name != "." && sr.Name != ".." && (sr.Attr & faDirectory)) { strlstDirNames->AddObject(strPath + sr.Name + "\\", (TObject*) sr.Size); GetDirFileName(strlstDirNames, strPath + sr.Name + "\\"); } } while(FindNext(sr) == 0); } } __finally { FindClose(sr); } } //--------------------------------------------------------------------------- // 폴더를 선택 한다.. bool CMain::SelectFolder(HWND Handle, char* Folder) { String dir = Folder; if (SelectDirectory("작업을 원하는 폴더를 선택하세요. ^^", "", dir)) { strcpy(Folder, dir.c_str()); return true; } return false; } //---------------------------------------------------------------------------
접기 접기
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) 의 의미는 따로 알아볼 필요가 있을듯
접기 접기
SearchDirectory( "c:\\directory\\" );
list< char * > m_ListTotalFileName;
int CFileDlg::SearchDirectory(const char *parm_search_path)
{
CString search_path = parm_search_path;
char *pFileName;
int nSearchPathLen;
WIN32_FIND_DATA file_data;
// 현재 경로의 모든 파일과 디렉토리를 찾는다.
HANDLE search_handle = FindFirstFile(search_path + "*.*", &file_data);
if(INVALID_HANDLE_VALUE != search_handle){
do{
if(FILE_ATTRIBUTE_DIRECTORY & file_data.dwFileAttributes)
{
// 폴더인 경우...
// 현재 폴더(.)와 이전폴더("..")를 의미하는 심볼은 제외시킨다.
if(file_data.cFileName[ 0 ] != '.')
{
// 서브 디렉토리를 계속 검색한다.
SearchDirectory(search_path + file_data.cFileName + CString("\\") );
}
}
else
{
pFileName = new char [ MAX_PATH ];
nSearchPathLen = strlen( search_path );
strcpy_s( pFileName, nSearchPathLen + 1, search_path );
strcpy_s( pFileName + nSearchPathLen, strlen( file_data.cFileName ) + 1, file_data.cFileName );
m_ListTotalFileName.push_back( pFileName );
}
} while(FindNextFile(search_handle, &file_data));
FindClose(search_handle);
}
return 0;
}
접기