if(hFind==INVALID_HANDLE_VALUE) { //파일검색실패시 MessageBox("파일을 찾을 수 없습니다."); }
while(1) { //모든 폴더마다 존재하는 경로인 "."과 ".."은 스킵 if(!(!(strcmp(FindFileData.cFileName, ".")) || !(strcmp(FindFileData.cFileName, "..")))) { //현재 파일의 전체 경로를 얻음 pPath=FilePath.Left(FilePath.GetLength()-1); pPath+=FindFileData.cFileName;
//해당 파일이 디렉토리라면, if((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { pPath+="\\*"; //재귀함수 호출(해당 폴더 안으로 들어가서 검색) GroupFolder(pPath, cnt, 0); }
//디렉토리가 아니고 파일이라면, else{ //원하는 확장자의 파일일경우(jpg, gif, mp3 등)
if(조건식을 어떤식으로 작성해야 되나요??) {
CopyFile(pPath, 복사될 디렉토리 경로, TRUE); }
}
//다음 파일을 검색 if(FindNextFile(hFind, &FindFileData)==FALSE) { DWORD dwErr=GetLastError(); if(dwErr != ERROR_NO_MORE_FILES) { //더이상 파일이 없는 에러가 아닌 다른 이유로 FindNextFile이 실패한 경우, //원하는 에러메시지 입력한다.
} break; } } } }
중간에..
//디렉토리가 아니고 파일이라면, else{ //원하는 확장자의 파일일경우(jpg, gif, mp3 등)
if(조건식을 어떤식으로 작성해야 되나요??) {
CopyFile(pPath, 복사될 디렉토리 경로, TRUE); }
이 부분에서 위와같이 조건문으로 비교해서 CopyFile()을 이용하여 복사를 하면 될것 같은데...
파일의 확장자를 어떻게 구해야될지도 잘 모르겠네요.. 조언부탁드립니다!!
그리고 소스코드를 보시고 이상한점이나 잘못된 부분이 있으면 지적부탁드립니다 감사합니다(__)
관리자14-08-01 12:19
분리해주는 함수도 있지만, 그렇게 하는것보다 그냥 파일이름의 뒤에서 앞으로 오면서 '.' 체크하는게 코드가 간단할거에요~
해당 폴더에 존재하는 .svn 폴더를 하위폴더 까지 검색해서 지우는 프로그램을 만든적이 있다.
"대충 만들면 되겠지" 라고 생각했지만 폴더 트리구조의 깊이가 정해져 있는 것도 아니고
막상 만들다보니 폴더 검색에서 막혔었다.
그래서 생각한 방법이 바로 재귀호출이다.
폴더 검색하는 함수를 만들어서 그 함수는 폴더를 검색하고,
하위 폴더 발견시 자신의 함수를 다시 재귀호출하는 방식이다.
물론 그 과정에서 불필요한 파일(.svn 폴더)을 발견하면 삭제한다.
아래 설명할 코드는 재귀호출로 디렉토리의 파일을 검색하는 소스코드이며
위와 같은 프로그램을 작성하기 위해서는
다음과 같은 함수를 같이 사용하면 된다.
function SetFileAttributes(lpFileName: PAnsiChar; dwFileAttributes: Cardinal) : Boolean; 파일 속성 변경(읽기전용, 숨김, 보통파일, 디바이스파일, 시스템파일 ........ ) unit : Windows lpFileName = 경로가 포함된 파일 이름 dwFileAttributes = 파일 속성 (예 : FILE_ATTRIBUTE_NORMAL) return = 속성 변경 성공 여부 (true/false)
function DeleteFile(FileName: string) : Boolean; 파일 삭제 unit : SysUtils FileName : 경로가 포함된 파일 이름 return = 파일 삭제 성공 여부 (true/false)
procedure RmDir(S: string) 디렉토리 삭제 unit : System S : 경로가 포함된 파일 이름