mwultong Blog ... 프로그래밍 / 계산기

컴퓨터 엑셀 워드 포토샵 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Sunday, December 24, 2006

C언어] DIR 함수; 디렉토리 파일 검색; 와일드카드 지원; findfirst findnext


도스의 dir 명령에서처럼, 지정해준 디렉토리 속의 모든 파일들의 리스트를 얻기 위해서는, 비주얼C의 경우 io.h 헤더파일의

_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;
}



컴파일 및 실행 결과:
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>


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++)

0 Comments:

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Previous Posts
Monthly Archives
Top