2012-09-08 2 views
1

디버깅했습니다.하지만 그 원인을 알 수는 없습니다.FindFirstFileEx 함수를 사용하여 디렉터리를 반복적으로 탐색합니다.

#ifndef UNICODE 
#define UNICODE 
#endif 


#include <stdio.h> 
#include <Windows.h> 


void EndWithBackslash(TCHAR* string) 
{ 
    if(string[wcslen(string)-1] != TEXT('\\')) wcscat(string,TEXT("\\")); 
} 


void Browse(const TCHAR* curdir) 
{ 
    HANDLE hFoundFile; 
    WIN32_FIND_DATA foundFileData; 
    TCHAR buffer[MAX_PATH]; 

    wcscpy(buffer,curdir); 

    EndWithBackslash(buffer); 

    SetCurrentDirectory(buffer); 

    hFoundFile = FindFirstFileEx(TEXT("*"),FINDEX_INFO_LEVELS::FindExInfoBasic,&foundFileData ,FINDEX_SEARCH_OPS::FindExSearchLimitToDirectories ,NULL , NULL); 

    if(hFoundFile != INVALID_HANDLE_VALUE) 
    { 
     do 
     { 
      if ((foundFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && wcscmp(foundFileData.cFileName,TEXT(".")) && wcscmp(foundFileData.cFileName,TEXT(".."))) 
      { 
       EndWithBackslash(buffer); 
       wcscat(buffer,foundFileData.cFileName); 
       wprintf(TEXT("%s\n"),buffer); 


       Browse(buffer); 
      } 
     } 
     while(FindNextFile(hFoundFile,&foundFileData)); 
     FindClose(hFoundFile); 


    } 
} 

int main(void) 
{ 
    Browse(TEXT("F:\\")); 

    system("Pause"); 
    return 0; 
} 

출력 :

F : \ $ RECYCLE.BIN
F : \ $ RECYCLE.BIN \ S-1-5-21-1271883188-2384997935-49719322-1000
F : \ $ RECYCLE.BIN \ 씨게이트
F : \ $ RECYCLE.BIN \ 씨게이트 \ 씨게이트 대시 보드 2.0
F : \ $ RECYCLE.BIN \ 씨게이트 \ 씨게이트 대시 보드 2.0 \ 시스템 볼륨 정보
F : \에 $ 재활용. BIN \ Seagate \ Seagate Dashboard 2.0 \ System 볼륨 정보 \ V IDEO
"첫 번째 레이어는"정말 보이는 않는 방법

:

enter image description here

당신이 내 실수 (들)을 지적 수 있을까요?

+0

디버그가 좀 더 구체적으로 할 때 재귀 호출로 돌아갑니다. –

+0

왜 'SetCurrentDirectory'를 사용합니까? 대신 전체 경로를 작성하는 것이 쉬우 며 디버거에서도 문제가 더 명확 해집니다. –

+2

디렉토리를 반복하는 동안'wcscat'를 사용하여 점점 더 많은 데이터를 계속해서 같은 버퍼에 계속 추가한다면 문제가 생깁니다. 대신 현재 dir 변수를 그대로 유지하고 발견 된 항목과 별도의 변수로 결합해야합니다. –

답변

2

안쪽 부분이 있어야한다 :

  TCHAR pszItemPath[MAX_PATH]; 
      wcscpy(pszItemPath, buffer); 
      // NOTE: Now when we took a copy of buffer, we don't touch it so that next iteration would have it good and untouched 
      EndWithBackslash(pszItemPath); 
      wcscat(pszItemPath, foundFileData.cFileName); 
      wprintf(TEXT("%s\n"), pszItemPath); 
관련 문제