손쉽게 File을 나열할 수 있는 class 공유(FindFirstFile/FindNextFile Wrapper)


파일 나열을 위해 FindFirstFile / FindNextFile을 사용하는데,
보통 SubDirectory를 지원하기 위해선 재귀호출을 사용해야 합니다.
그러다보면 자연히 코드가 좀더 너저분해 지는 경향이 있습니다.
그리고, Path의 Component(즉, \...\ 사이에 있는 길이)가 MAX_PATH를 넘어가면 발생하는 문제 해결을 위해,
Naming a file(\\?\를 붙이기)이 필요합니다. 해당 부분도 역시 지원합니다.

다음 code(class)만 추가하면 됩니다.

  1. #pragma once  
  2. #include "FileTraverse.h"  
  3.   
  4. class CFileEnumProcess : public CFileTraverse  
  5. {  
  6. public:  
  7.     CFileEnumProcess(void);  
  8.     ~CFileEnumProcess(void);  
  9.   
  10. public:  
  11.     virtual BOOL OnTraverse(IN LPCTSTR lpszFullPath, IN LPCTSTR lpszNamedPath, IN PWIN32_FIND_DATA pstFD);  
  12. };  


  1. #include "StdAfx.h"  
  2. #include "FileEnumProcess.h"  
  3.   
  4. CFileEnumProcess::CFileEnumProcess(void)  
  5. {  
  6. }  
  7.   
  8. CFileEnumProcess::~CFileEnumProcess(void)  
  9. {  
  10. }  
  11.   
  12. BOOL CFileEnumProcess::OnTraverse(IN LPCTSTR lpszFullPath, IN LPCTSTR lpszNamedPath, IN PWIN32_FIND_DATA pstFD)  
  13. {  
  14.     BOOL bContinue = TRUE;  
  15.   
  16.     _tprintf(TEXT("[0x%x] %s\r\n"), pstFD->dwFileAttributes, lpszFullPath);  
  17.   
  18.     return bContinue;  
  19. }  


즉, CFileTraverse를 상속하고,
virtual BOOL OnTraverse(IN LPCTSTR lpszFullPath, IN LPCTSTR lpszNamedPath, IN PWIN32_FIND_DATA pstFD);
만 재정의 하시면 됩니다.

Enum을 중단하려면 FALSE를 리턴하면 됩니다.

위와 같이 class를 정의하고,
  1. #include "stdafx.h"  
  2.   
  3. #include "FileEnumProcess.h"  
  4.   
  5. int _tmain(int argc, _TCHAR* argv[])  
  6. {  
  7.     CFileEnumProcess cFileEnum;  
  8.   
  9.     cFileEnum.Traverse(TEXT("C:\\"), TRUE);  
  10. }  

와 같이 호출하면, C:\ 하부에 있는 파일을 아래와 같이 나열(_tprintf)합니다.
...
[0x20] C:\eclipse\configuration\org.eclipse.osgi\bundles\321\1\.cp\icons\full\dl
cl16\localtypes_co.gif
[0x20] C:\eclipse\configuration\org.eclipse.osgi\bundles\321\1\.cp\icons\full\dl
cl16\public_co.gif
[0x20] C:\eclipse\configuration\org.eclipse.osgi\bundles\321\1\.cp\icons\full\dl
cl16\static_co.gif
[0x10] C:\eclipse\configuration\org.eclipse.osgi\bundles\321\1\.cp\icons\full\dt
ool16
[0x20] C:\eclipse\configuration\org.eclipse.osgi\bundles\321\1\.cp\icons\full\dt
ool16\mark_occurrences.gif
...