2010년 6월 25일 금요일

선택한 폴더 아래 모든 파일 찾기

갑자기 개발 파일 목록화를 진행한단다.

 

내용이 너무 많아 하나하나 정리하기 힘들어

 

선택한 폴더 아래의 모든 파일을 찾아 파일로 저장하는 프로그램을 제작해 보았다.

 

선택한 폴더의 하위 폴더까지 검색하여 목록을 파일로 구분자는 TAB을 이용하여 저장하였다.

 

 

 

Open 버튼을 선택하면

 

파일 경로를 선택하는 찾이 뜬다

 

창은  SHBrowseForFolder 사용


/************************************************************************/
/* 시작 폴더 Open                                                                              */
/************************************************************************/
void CFileAllLoadDlg::OnBnClickedButtonopen()
{
 /// 저장된 폴더 수량 초기화
 m_nFoldCount = 0;
 /// 파일 이름 count 초기화 (Message 리스트 수량)
 m_nIndexList = 0;
 ITEMIDLIST *pildBrowse;
 char pszPathname[MAX_PATH];
 BROWSEINFO bInfo;
 memset( &bInfo, 0, sizeof(bInfo));
 bInfo.hwndOwner = GetSafeHwnd();
 bInfo.pidlRoot = NULL;
 bInfo.pszDisplayName = (LPSTR)(LPCWSTR)pszPathname;
 bInfo.lpszTitle = _T("디렉토리를 선택하세요");
 bInfo.ulFlags = BIF_RETURNONLYFSDIRS;
 pildBrowse = ::SHBrowseForFolder(&bInfo);

 if(pildBrowse != NULL)
 {
  /// Open 한 폴더 열기
  SHGetPathFromIDList(pildBrowse, (LPTSTR)pszPathname);
  (LPCTSTR)pszPathname;

  CString strPathName = (LPCTSTR)pszPathname; //dlgFile.GetPathName();
  /// 폴더 Open 실패
  if(strPathName == "")
   return;

  /// 폴더 이름 저장
  m_LISTDIR.push_back(strPathName);
  GetFileNameData();
  /// Open 프로그래스 위치
  m_ctrPrograssOpen.SetPos(1);
 }
}

 

http://tong.nate.com/gabester/24397313 내용 참조

 

CFileFind 를 이용하여 폴더의 내용 검색

 

하위 폴더는 따로 List 에 입력하여 관리

 


/************************************************************************/
/*  파일 이름 찾기                                                               */
/************************************************************************/
void CFileAllLoadDlg::GetFileNameData()
{
 LISTDIR::iterator iter;

 iter = m_LISTDIR.begin();
 CString strPath = (*iter);
 /// 파일 객체 생성
 m_pFileFind = new CFileFind;
 CString strFolderTemp = strPath+_T("\\*.* ");

 m_ctrDirPas.SetWindowText(strFolderTemp);
 m_ctrDirPas.UpdateWindow();
 /// 파일 읽기
 BOOL bWorking = m_pFileFind->FindFile(strFolderTemp);
 if(bWorking == TRUE)
 {
  m_nTime = SetTimer(1, 300, 0);
 }
}

 

파일은 바로 저장 및 메시지로 표시

 

Timer 를 이용하여 파일 내용 검색

   BOOL bWorking = m_pFileFind->FindNextFile();
   int nCount = (int)m_LISTDIR.size();
   /// 선택한 다름파일 이없는 경우 삭제
   if(bWorking == FALSE)
   {
    m_nFoldCount = m_nFoldCount+1;
    int nState =(100*m_nFoldCount)/nCount;
    m_ctrPrograssOpen.SetPos(nState-1);

    KillTimer(m_nTime);
    m_pFileFind->Close();
    delete m_pFileFind;
    m_pFileFind = NULL;
    m_LISTDIR.pop_front();
    CheckFolder();

    break;
   }
   
   /// 점인경우
   if(m_pFileFind->IsDots())
    break;

   CString strStateFolder = m_pFileFind->GetFilePath();
   /// 내부 폴더인경우
   if(m_pFileFind->IsDirectory())
   {
    CString strFolder = m_pFileFind->GetFilePath();
    /// 폴더 저장
    m_LISTDIR.push_back(strFolder);
   }
   else
   {
    CString strFileNameTemp = m_pFileFind->GetFileName();
    int nfindFile = strFileNameTemp.ReverseFind('.');
    int nTotalFile = strFileNameTemp.GetLength();
    CString strLoadFile = strFileNameTemp.Left(nfindFile);
    CString strFileT = strFileNameTemp.Right(nTotalFile-nfindFile);

    m_nIndexList = m_nIndexList+1;
    CString strFolder = m_pFileFind->GetFilePath();
    int nFind = strFolder.ReverseFind('\\');
    strFolder = strFolder.Left(nFind);
    CString strIndex;
    strIndex.Format("%d", m_nIndexList);

    strFolder = strIndex+"  "+strFolder+" "+strLoadFile+" "+strFileT;
    m_pCMultiFileControl->WriteFileData("FileLoad.ini", (LPTSTR)(LPCTSTR)strFolder, m_nIndexList, WRITE_INSERTLINE);
    TRACE(_T("%s\n"), strFileNameTemp);

    if(m_ctrListMessage.GetCount() > 50 )
     m_ctrListMessage.DeleteString(0);

    m_ctrListMessage.AddString(strFolder);
    //   m_ctrListMessage.SetSel(m_ctrListMessage.GetCount()-1, TRUE);
    m_ctrListMessage.UpdateWindow();
   }

 

저장된 List 이용 하위 폴더 확인


/************************************************************************/
/* 하위폴더 여부 확인                                                             */
/************************************************************************/
void CFileAllLoadDlg::CheckFolder()
{
 int nCont = (int)m_LISTDIR.size();
 if( nCont > 0)
 {
  /// 하위폴더가 있을시
  GetFileNameData();
 }
 else
  m_ctrPrograssOpen.SetPos(100);
}

 

첨부 내용은 디버거 버전의 Install 프로그램 ^^

 

소스코드는 요청해주시면 바로 올리겠습니다.



출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

댓글 없음:

댓글 쓰기