영상처리를 하다가 하위 폴더가 아닌 어떤 폴더 안에 모든 폴더를 자동으로 검색해야 할 때가 있어 이리저리 찾아봤었는데 좀 복잡했다.ㅡ0ㅡ
우선 기본적으로 folder를 Search하는 방법과 짬뽕하여 사용하였다.
몇몇 블로그에서 CFileFind만 있으면 해결된다고 나와있는데 코드가 부족.ㅠ! 디렉토리인지 아닌지는 검색할 수 있다만...문제는 다음 폴더로 넘어가는게 문제이고, 하위 폴더에 내가 원하는 파일이 있는가를 알기가 힘들기 때문에 두 가지를 모두 사용하여야 했다.
<FolderSearch 를 통하여 해당 폴더를 선택후 Path를 받아옴>
CFileFind cFileFinder;//CFileFind 객체 선언
BOOL End_Of_Folder = false;//폴더의 끝인가를 검사
m_strSelectPath = m_strSelectPath + "\\*.*";
cFileFinder.FindFile(Path);//폴더를 검색하여 File을 찾음.
End_Of_Folder = cFileFinder.FindNextFile();// 파일의 끝인지를 검사
//이걸 먼저 해주지 않고 바로 CFileFind::IsDirectory()를 호출하면 에러가 난다.
while(End_Of_Folder)//파일의 끝이 아니면 루프를 돈다.
{
//다음 폴더가 있는가를 검사한다.
End_Of_Folder = cFileFinder.FindNextFile();
//이걸 마지막에 해줘버리면 마지막 폴더가 검색되지 않는다.
if(cFileFinder.IsDirectory())//현재 검색한 경로의 파일이 디렉토리인가를 검사
{
if(cFileFinder.IsDots()) continue;
//[.] [..] 와 같은 상위폴더로 가는 루트가 나오면 다쉬~
CString lowPath = cFileFinder.GetFilePath();//검색된 folder의 Path를 가져온다.
lowPath = lowPath + " \\*.bmp"; //하위 폴더에 원하는 확장자를 추가
//기존 ForderSearch 와 동일한 코드이다. 우선 folder내의 첫번째 File을 검색하여 핸들을 받아온다.
hFileHandle = FindFirstFile(lowPath, &finedFileData);
int tempFileCount = 0;
if(hFileHandle != INVALID_HANDLE_VALUE)//원하는 파일이 있다면
{
tempFileCount++;//File의 수를 count
while(FindNextFile(hFileHandle, &finedFileData))//다음 File검사
{
tempFileCount++;
}
FindClose(hFileHandle);//folder를 닫음
}
//부가기능~ 아래 코드는 Folder의 개수와 File의 개수를 count한다.
//몇개가 될지 모르기 때문에 동적으로 할당하여 처리한다.
if(k==0 && tempFileCount != 0)
{
k++;
i = new int[k];
i[0] = tempFileCount;
}
else if(k != 0 && tempFileCount != 0)
{
int *temp;
temp = i;
i = new int[k + 1];
for(int j = 0; j < k; j++)
{
i[j] = temp[j];
}
i[k] = tempFileCount;
delete []temp;
k++;
}
//다음 폴더가 있는가를 검사한다.
//End_Of_Folder = cFileFinder.FindNextFile();
}
}
내 머리의 한계라고 볼 수 있다.ㅡ_ㅡ;;
Imagefile이 많으면 이 코드는 오버해드가 매우 심하다.
특히 File의 FullPath를 알아오는 코드는 CString 객체를 Folder수 만큼 또는 File수만큼 동적 할당하여야 한후 받아와야 하기때문에 위 코드를 한번더 돌려야 한다. (한번에 받아오는걸 생각해봤지만 많은 swap 을 해야하기 때문에 차라리 한번 더 돌리는게 낮다고 판단..(사실 시간없다는 핑계로 해보진 않았지만 속도는 나중에 test해서 올릴거임~)
더 좋은 방법이 있다면 꼭 뎃글(유도하는거 아님^^;)로 알려주길 바랍니다~
(머..내가 찾으면 또 다시 올리지머..ㅠㅠ)