[C] 파일을 포함하는 디렉토리 삭제

하위 디렉토리나 하위 파일을 포함하는 디렉토리를 삭제하는 함수입니다.

int DeleteAllFiles(LPCWSTR szDir, int recur)
{
    HANDLE hSrch;
    WIN32_FIND_DATA wfd;
    int res = 1;

    TCHAR DelPath[MAX_PATH];
    TCHAR FullPath[MAX_PATH];
    TCHAR TempPath[MAX_PATH];

    lstrcpy(DelPath, szDir);
    lstrcpy(TempPath, szDir);
    if (lstrcmp(DelPath + lstrlen(DelPath) - 4, _T("\\*.*")) != 0) {
        lstrcat(DelPath, _T("\\*.*"));
    }

    hSrch = FindFirstFile(DelPath, &wfd);
    if (hSrch == INVALID_HANDLE_VALUE) {
        if (recur > 0) RemoveDirectory(TempPath);
        return -1;
    }

    while(res) {
        wsprintf(FullPath, _T("%s\\%s"), TempPath, wfd.cFileName);

        if (wfd.dwFileAttributes & FILE_ATTRIBUTE_READONLY) {
            SetFileAttributes(FullPath, FILE_ATTRIBUTE_NORMAL);
        }

        if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
            if (lstrcmp(wfd.cFileName, _T(".")) 
                && lstrcmp(wfd.cFileName, _T(".."))) {
                recur++;
                DeleteAllFiles(FullPath, recur);
                recur--;
            }
        } else {
            DeleteFile(FullPath);
        }

        res = FindNextFile(hSrch, &wfd);
    }

    FindClose(hSrch);

    if (recur > 0) RemoveDirectory(TempPath);

    return 0;
}

성공하면 0을 반환하고 그렇지 않다면 -1을 반환. 인자인 recur이 1이면 szDir로 지정된 디렉토리 자체도 삭제하고 0이라면 szDir로 지정된 디렉토리 자체는 삭제하지 않습니다. 참고로 이 함수는 제가 만드거 아니고 인터넷에서 찾은 것인데 출처를 몰라 =_=; 여튼, 좋은 함수 제공해 주셔서 감사합니다 !

[C++11] decltype

decltype은 주어진 표현식에 대한 결과의 타입을 컴파일러가 추론하라는 키워드(keyword)입니다. 예를 들어서 다음의 코드를 보면..

#include "stdafx.h"
#include 

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    cout << typeid(decltype(10)).name() << endl;

    return 0;
}

위 코드에서 8번을 보면 decltype(10)이라는 코드가 있는데, 표현식 10에 해당하는 type을 컴파일러가 추론을 하여 해당 타입의 이름을 출력하게 되는 것으로 결과는 'int'를 출력합니다.

또 다른 예를 살펴보면..

#include "stdafx.h"
#include 

using namespace std;

auto func(int a, int b) -> decltype(a + b)
{
    return a + b;
}

int _tmain(int argc, _TCHAR* argv[])
{
    cout << func(100, 200) << endl;

    return 0;
}

6번 코드를 보면 함수의 결과값에 auto를 사용할 수 없음에도 func라는 함수의 반환값이 auto를 사용하고 있습니다. 이것이 가능한 이유는 바로 함수의 정의 뒤에 오는 -> decltype(a+b)에 의해서 입니다. 즉, a+b에 대한 결과값의 타입을 추론하여 ->에 의해 함수의 반환값 추론에 대한 힌트를 제공하는 것입니다. a와 b는 int 타입이고 이 int 값들의 합 역시 int이므로 쉽게 함수의 결과값의 타입은 int라는 것을 추론할 수 있는 것입니다.