차근차근/C

c삭제 명령어?

예쁜꽃이피었으면 2014. 9. 3. 14:27

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=129781701&qb=Y3BwICwg7Y+0642U66qFIOydveq4sA==&enc=utf8§ion=kin&rank=1&search_sort=0&spq=0



단순히 컴파일이 안 된다고 한다면 제가 소스에 오타를 내서 그런겁니다. ㅈㅅ...

수정해 드렸으니 컴파일은 될 겁니다. 근데 성능 테스트는 못 해봤습니다.

저도 다른 레포트가 있어서 시간이 빠듯하네요 ㅠㅠ

 

#include <windows.h> // 하위 파일 검색하고 이런 거는 C 표준 라이브러리에 없습니다. 그래서 윈도우 API 씁니다.
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#include <tchar.h>
#include <locale.h>

// 디렉터리면 1 아니면 0 반환
int __isdir(const TCHAR * path);
// 부모 경로 주면 하위 디렉터리 이름 따오기
void __getsubdir(const TCHAR * path, TCHAR*** buf, size_t * buf_cnt);
// 지정된 파일 삭제
void __delfiles(const TCHAR * path, const TCHAR * extension);

void main()
{
    TCHAR drv[512], ext[512];

 setlocale(LC_ALL, "korean");

 memset(drv, 0, 512 * sizeof(TCHAR));
 memset(ext, 0, 512 * sizeof(TCHAR));

    _tprintf(_TEXT("작업할 드라이브명 (입력 예: C:) >> "));

#if defined(UNICODE) || defined(_UNICODE)
 _tscanf(_TEXT("%ws"), drv);
#else
    _tscanf(_TEXT("%s"), drv);
#endif

    _tprintf(_TEXT("확장명? 입력예 *.jpg"));
#if defined(UNICODE) || defined(_UNICODE)
    _tscanf(_TEXT("%ws"), ext);
#else
 _tscanf(_TEXT("%s"), ext);
#endif

    __delfiles(drv, ext);
}

int __isdir(const TCHAR * path)
{
 /*
    _finddatai64_t c_file;
    intptr_t hFile;
    int ret;

    hFile = _findfirsti64(path, &c_file); // 해당 경로에 해당하는 거 읽기

    if(hFile == -1L) ret = -1; // 그런 경로가 없다면 -1을 반환
    else if(c_file.attrib & _A_SUBDIR != 0) ret = 1; // 주어진 경로가 디렉터리면 1 반환
    else ret = 0; // 주어진 경로가 파일이면 0 반환

    _findclose(hFile); // 탐색 종료

    return ret;
 */

 HANDLE hItem = NULL;
 WIN32_FIND_DATA cFindData;
 int ret = 0;

 hItem = FindFirstFile(path, &cFindData);

 if(hItem == INVALID_HANDLE_VALUE) ret = -1;
 if(hItem == NULL) ret = -1;

 if((cFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) ret = 0;
 else ret = 1;

 FindClose(hItem);

 return ret;
}

 

//매개변수 == 각각 부모 경로, 하위 디렉터리 이름 담는 곳, 하위 디렉터리 수 반환
void __getsubdir(const TCHAR * path, TCHAR *** buf, size_t * buf_cnt)
{
    HANDLE hItem;
    WIN32_FIND_DATA findData;

    *buf = NULL;
    *buf_cnt = 0;

    hItem = FindFirstFile(path, &findData);

    if(hItem == INVALID_HANDLE_VALUE) return;

    do
    {
        // 디렉터리면 목록에 추가
        if((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
        {
   *buf = (TCHAR **)realloc(*buf, (*buf_cnt + 1) * sizeof(TCHAR *));
   *buf[*buf_cnt] = (TCHAR *)calloc(_tcslen(findData.cFileName) + 1, sizeof(TCHAR));
   
   _tcscpy(*buf[*buf_cnt], findData.cFileName);
   *buf_cnt = *buf_cnt + 1;
        }
    } while(FindNextFile(hItem, &findData));

    FindClose(hItem);
}

// 디렉터리내의 지정한 확장명의 파일 지움
void __delfiles(const TCHAR * path, const TCHAR * extension)
{
 TCHAR ** subdirs; // 하위 디렉터리
 size_t subdir_cnt; // 하위 디렉터리 수
 TCHAR command[512]; // 조합된 명령어

    size_t i = 0; // 다용도 인덱스 변수

 // 일단 작업 디렉터리를 path로 옮기고
    _tchdir(path);

 // path의 파일들 삭제 (하위 디렉터리는 아직 검색 안 함)
#if defined(UNICODE) || defined(_UNICODE)
 _stprintf(command, TEXT("del %ws"), extension);
#else
    _stprintf(command, TEXT("del %s"), extension);
#endif

 // 명령 실행
    _tsystem(command);

 // 하위 디렉터리 이름 따오고 나서
    __getsubdir(path, &subdirs, &subdir_cnt);

    // 재귀함수
    for(i = 0; i < subdir_cnt; i++)
    {
        // 하위 디렉터리의 전체 경로 == 매개변수로 들어온 부모 경로 + getsubdir로 찾은 하위 폴더명
#if defined(UNICODE) || defined(_UNICODE)
  _stprintf(command, _TEXT("%ws\\%ws"), path, subdirs[i]);
#else
  _stprintf(command, _TEXT("%s\\%s"), path, subdirs[i]);
#endif

        // 재귀 콜
        __delfiles(command, extension);
    }
}

반응형