C언어 기반 파일 탐색 프로그램 "HEAP CORRUPTION DETECTED" 오류

조회수 696회

컴퓨터에 있는 특정 폴더를 제외한 파일 전체를 탐색하는 프로그램을 작성중입니다. 실행하면 "HEAP CORRUPTION DETECTED" 라는 디버그 에러가 발생하는데 이 에러가 발생하는 경우는

  • 메모리 할당이 되지 않은 포인터(NULL Pointer)에 값을 넣음
  • 할당치를 초과하여 데이터가 입력됨

라고 나와있어 열심히 코드를 뒤적거리고 수정해봤지만 해결되지 않았습니다! VisualStudio로 디버깅을 시도했을 땐 do-while문 내에서 발생한다는데,

조언 부탁드려요.

#define MAX_LEN 1024

void FindAllFiles(char file_path[]) {
    HANDLE hFileHandle; // File Descriptor Handle
    WIN32_FIND_DATA findFileData; // File Data 구조

    char file_path2[_MAX_PATH];
    strcat(file_path, "\\");
    strcpy(file_path2, file_path);
    strcat(file_path, "*");

    hFileHandle = FindFirstFile(file_path, &findFileData);
    //찾고 싶은 파일명과 핸들을 얻어옴

    if (hFileHandle != INVALID_HANDLE_VALUE) {
        do {//TESTTEST 폴더를 제외하고 탐색
            printf("findFileData.cFileName : %s\n", findFileData.cFileName);
            if (!((strcmp(findFileData.cFileName, ".") == 0) || (strcmp(findFileData.cFileName, "..") == 0) || (strcmp(findFileData.cFileName, "TESTTEST") == 0))) {

                //파일 속성을 참조하여 파일이면 암호화 폴더로 넘김
                //디렉토리이면 재귀 호출 시도

                if ((findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { //디렉토리면

                    string subFolder = file_path2;
                    subFolder.append("\\");
                    subFolder.append(findFileData.cFileName);

                }
                else { // 디렉토리가 아닌 파일이면
                    int File_Size = (findFileData.nFileSizeHigh * (MAXDWORD + 1)) + findFileData.nFileSizeLow;

                    //File_In_Out(file_pt, File_Size);
                }
            }
            else {
                if (!((strcmp(findFileData.cFileName, ".") == 0) || (strcmp(findFileData.cFileName, "..") == 0))) {
                    printf("예외 설정 파일 : %s\n", findFileData.cFileName);
                }
            }
            //다음 File Handle로 접근
        } while (FindNextFile(hFileHandle, &findFileData));
    }
    //파일을 찾은 후 핸들 종료
    FindClose(hFileHandle);
}

int main(void) {
    char file_path[_MAX_PATH] = "D:\TEST";
    printf("파일 서치 시작\n");
    FindAllFiles(file_path);

    return 0;
}

<오류>

이미지

1 답변

  • 실행 시켜봤는데 잘 동작하네요.

    단, 컴파일할 때 경고메시지가 하나 뜨긴 하는데, 메인 함수안의 "D:\TEST""D:\\TEST"로 바꾸어 주면 경고메시지를 해결할 수 있습니다.

    잘 동작하는 것으로 보아 코드 문제라기 보단 컴퓨터 설정 등의 문제인것 같습니다.

    아래 코드 및 결과 참고하세요.

    -코드

    #define _CRT_SECURE_NO_WARNINGS
    
    #include <Windows.h>
    #include <string>
    
    using namespace std;
    
    #define MAX_LEN 1024
    
    void FindAllFiles(char file_path[]) {
        HANDLE hFileHandle; // File Descriptor Handle
        WIN32_FIND_DATA findFileData; // File Data 구조
    
        char file_path2[_MAX_PATH];
        strcat(file_path, "\\");
        strcpy(file_path2, file_path);
        strcat(file_path, "*");
    
        hFileHandle = FindFirstFile(file_path, &findFileData);
        //찾고 싶은 파일명과 핸들을 얻어옴
    
        if (hFileHandle != INVALID_HANDLE_VALUE) {
            do {//TESTTEST 폴더를 제외하고 탐색
                printf("findFileData.cFileName : %s\n", findFileData.cFileName);
                if (!((strcmp(findFileData.cFileName, ".") == 0) || (strcmp(findFileData.cFileName, "..") == 0) || (strcmp(findFileData.cFileName, "TESTTEST") == 0))) {
    
                    //파일 속성을 참조하여 파일이면 암호화 폴더로 넘김
                    //디렉토리이면 재귀 호출 시도
    
                    if ((findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { //디렉토리면
    
                        string subFolder = file_path2;
                        subFolder.append("\\");
                        subFolder.append(findFileData.cFileName);
                    }
                    else { // 디렉토리가 아닌 파일이면
                        int File_Size = (findFileData.nFileSizeHigh * (MAXDWORD + 1)) + findFileData.nFileSizeLow;
    
                        //File_In_Out(file_pt, File_Size);
                    }
                }
                else {
                    if (!((strcmp(findFileData.cFileName, ".") == 0) || (strcmp(findFileData.cFileName, "..") == 0))) {
                        printf("예외 설정 파일 : %s\n", findFileData.cFileName);
                    }
                }
                //다음 File Handle로 접근
            } while (FindNextFile(hFileHandle, &findFileData));
        }
        //파일을 찾은 후 핸들 종료
        FindClose(hFileHandle);
    }
    
    int main(void) {
        char file_path[_MAX_PATH] = "D:\\TEST";
        printf("파일 서치 시작\n");
        FindAllFiles(file_path);
    
        return 0;
    }
    
    • 결과

    이미지

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 설정이랑 코드 살짝 고치니 작동되었습니다 답변 감사합니다! 알 수 없는 사용자 2021.1.18 11:21

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)