단순히 컴파일이 안 된다고 한다면 제가 소스에 오타를 내서 그런겁니다. ㅈㅅ...
수정해 드렸으니 컴파일은 될 겁니다. 근데 성능 테스트는 못 해봤습니다.
저도 다른 레포트가 있어서 시간이 빠듯하네요 ㅠㅠ
#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);
}
}
'차근차근 > C' 카테고리의 다른 글
상위폴더경로로 하위폴더 검색 (0) | 2014.09.03 |
---|---|
하위디렉토리명 가져오기.. (0) | 2014.09.03 |
[MFC] 현재 디렉토리 읽어오기 (0) | 2014.09.03 |
[C/C++]폴더 검색 함수 (0) | 2014.09.03 |
[C언어] 파일 및 디렉토리 이름 변경 함수 - rename (0) | 2014.09.03 |