본문 바로가기

Language/MFC

MFC 상위 폴더경로로 하위 폴더 검색방법(수정안)

영상처리를 하다가 하위 폴더가 아닌 어떤 폴더 안에 모든 폴더를 자동으로 검색해야 할 때가 있어 이리저리 찾아봤었는데 좀 복잡했다.ㅡ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해서 올릴거임~)

더 좋은 방법이 있다면 꼭 뎃글(유도하는거 아님^^;)로 알려주길 바랍니다~
(머..내가 찾으면 또 다시 올리지머..ㅠㅠ)