Sunday, December 24, 2006
C언어] DIR 함수; 디렉토리 파일 검색; 와일드카드 지원; findfirst findnext
도스의 dir 명령에서처럼, 지정해준 디렉토리 속의 모든 파일들의 리스트를 얻기 위해서는, 비주얼C의 경우 io.h 헤더파일의
_findfirst() _findnext() 함수를 사용합니다. "*.*" 같은 와일드카드도 지원합니다.
_findfirst() 로 우선 첫번째 파일 하나를 찾은 후, 그 다음 파일부터는 _findnext() 로 계속 찾는 것입니다. 그리고 함수의 사용이 끝났으면 _findclose() 함수로, 반드시 메모리를 해제해 주어야 합니다.
그런데 _findfirst() / _findnext() 로는, 3GB가 넘는 거대한 파일을 다룰 수 없기에
현실적으로는 _findfirsti64() / _findnexti64() 함수를 사용해야 합니다.
파일명: 0.cpp
컴파일 및 실행 결과:
char path[] = "*.*";
이렇게 하면 "현재 디렉토리"의 모든 파일이 출력됩니다.
char path[] = "D:/Y/*.*";
이렇게 하면 "D:\Y" 폴더의 모든 파일을 출력합니다. 모든 파일 출력시, 폴더에 파일이 하나도 없더라도
.
..
이렇게 "현재 디렉토리"를 나타내는 점 1개(.)와, 상위 디렉토리를 나타내는 점 2개(..)는 나옵니다.
char path[] = "D:/Y";
이렇게 지정하면
Y
이렇게 Y 라는 디렉토리 자체가 나옵니다.
에러가 날 경우
"Invalid path name (잘못된 파일/디렉토리명)"
"Not enough memory or file name too long (메모리 부족/너무 긴 패스명)"
"Unknown error (그밖의 알 수 없는 에러)"
등의 메시지가 출력됩니다.
ENOENT 등의 에러는 컴파일러 버전에 따라서 좀 다를 수 있습니다. 이 예제는 Visual C++ 2003 에서 만들어진 것입니다.
업데이트:
여기에 좀더 본격적인 DIR 소스가 있습니다: ▶▶ C언어 VC] 도스 DIR 명령 구현; 파일 목록(리스트) 출력; 와일드 카드(Wild Card) 지원
_findfirst() _findnext() 함수를 사용합니다. "*.*" 같은 와일드카드도 지원합니다.
_findfirst() 로 우선 첫번째 파일 하나를 찾은 후, 그 다음 파일부터는 _findnext() 로 계속 찾는 것입니다. 그리고 함수의 사용이 끝났으면 _findclose() 함수로, 반드시 메모리를 해제해 주어야 합니다.
그런데 _findfirst() / _findnext() 로는, 3GB가 넘는 거대한 파일을 다룰 수 없기에
현실적으로는 _findfirsti64() / _findnexti64() 함수를 사용해야 합니다.
VC++: 현재 디렉토리의, "모든 파일(*.*)" 목록 출력 예제
파일명: 0.cpp
#include <stdio.h>
#include <stdlib.h> // exit()
#include <io.h>
#include <errno.h>
int main(void) {
_finddatai64_t c_file;
intptr_t hFile;
char path[] = "*.*";
if ( (hFile = _findfirsti64(path, &c_file)) == -1L ) {
switch (errno) {
case ENOENT:
printf(":: 파일이 없음 ::\n"); break;
case EINVAL:
fprintf(stderr, "Invalid path name.\n"); exit(1); break;
case ENOMEM:
fprintf(stderr, "Not enough memory or file name too long.\n"); exit(1); break;
default:
fprintf(stderr, "Unknown error.\n"); exit(1); break;
}
} // end if
else {
printf("-- 파일 목록 --\n");
do {
printf("%s\n", c_file.name);
} while(_findnexti64(hFile, &c_file) == 0);
_findclose(hFile); // _findfirsti64(), _findnexti64()에 사용된 메모리를 반환
} // end else
return 0;
}
#include <stdlib.h> // exit()
#include <io.h>
#include <errno.h>
int main(void) {
_finddatai64_t c_file;
intptr_t hFile;
char path[] = "*.*";
if ( (hFile = _findfirsti64(path, &c_file)) == -1L ) {
switch (errno) {
case ENOENT:
printf(":: 파일이 없음 ::\n"); break;
case EINVAL:
fprintf(stderr, "Invalid path name.\n"); exit(1); break;
case ENOMEM:
fprintf(stderr, "Not enough memory or file name too long.\n"); exit(1); break;
default:
fprintf(stderr, "Unknown error.\n"); exit(1); break;
}
} // end if
else {
printf("-- 파일 목록 --\n");
do {
printf("%s\n", c_file.name);
} while(_findnexti64(hFile, &c_file) == 0);
_findclose(hFile); // _findfirsti64(), _findnexti64()에 사용된 메모리를 반환
} // end else
return 0;
}
컴파일 및 실행 결과:
D:\Z>cl /nologo 0.cpp && 0.exe
0.cpp
-- 파일 목록 --
.
..
0.bat
0.cpp
0.exe
0.obj
15698793.htm
15698793_files
antivirus_v3_plus_neo_dos_freeware.png
d0.cpp
Foo.class
Foo.java
ggg.doc
ggg.txt
Jaso.class
Jaso.java
out.txt
test.txt
강병철과 삼태기 - 냉면.mp3
새 폴더
D:\Z>
0.cpp
-- 파일 목록 --
.
..
0.bat
0.cpp
0.exe
0.obj
15698793.htm
15698793_files
antivirus_v3_plus_neo_dos_freeware.png
d0.cpp
Foo.class
Foo.java
ggg.doc
ggg.txt
Jaso.class
Jaso.java
out.txt
test.txt
강병철과 삼태기 - 냉면.mp3
새 폴더
D:\Z>
char path[] = "*.*";
이렇게 하면 "현재 디렉토리"의 모든 파일이 출력됩니다.
char path[] = "D:/Y/*.*";
이렇게 하면 "D:\Y" 폴더의 모든 파일을 출력합니다. 모든 파일 출력시, 폴더에 파일이 하나도 없더라도
.
..
이렇게 "현재 디렉토리"를 나타내는 점 1개(.)와, 상위 디렉토리를 나타내는 점 2개(..)는 나옵니다.
char path[] = "D:/Y";
이렇게 지정하면
Y
이렇게 Y 라는 디렉토리 자체가 나옵니다.
에러가 날 경우
"Invalid path name (잘못된 파일/디렉토리명)"
"Not enough memory or file name too long (메모리 부족/너무 긴 패스명)"
"Unknown error (그밖의 알 수 없는 에러)"
등의 메시지가 출력됩니다.
ENOENT 등의 에러는 컴파일러 버전에 따라서 좀 다를 수 있습니다. 이 예제는 Visual C++ 2003 에서 만들어진 것입니다.
업데이트:
여기에 좀더 본격적인 DIR 소스가 있습니다: ▶▶ C언어 VC] 도스 DIR 명령 구현; 파일 목록(리스트) 출력; 와일드 카드(Wild Card) 지원
tag: cpp
C언어 | C/C++ (Visual C++)
<< Home