2008-08-15 5 views

답변

5

opendir/readdir은 POSIX입니다.

#include <stdio.h> 
#include <sys/types.h> 
#include <dirent.h> 

int main (void) 
{ 
    DIR *dp; 
    struct dirent *ep;  
    dp = opendir ("./"); 

    if (dp != NULL) 
    { 
    while (ep = readdir (dp)) 
     puts (ep->d_name); 

    (void) closedir (dp); 
    } 
    else 
    perror ("Couldn't open the directory"); 

    return 0; 
} 

(신용 : http://www.gnu.org/software/libtool/manual/libc/Simple-Directory-Lister.html)

68

을 확인 엄밀한 대답은 폴더의 개념이 진정한 크로스 플랫폼이 아니기 때문에 "할 수 없다"입니다.

MS 플랫폼에서는 _findfirst, _findnext 및 _findclose를 사용하여 'c'종류의 느낌을주고 FindFirstFile 및 FindNextFile을 기본 Win32 호출에 사용할 수 있습니다.

http://c-faq.com/osdep/readdir.html

+1

에 샘플 코드를 찾을 수 있습니다이 적어도는 MinGW와 함께뿐만 아니라 Windows에서 작동합니다. –

+1

@ 클레이튼하지만 인쇄 할 문자가 얼마나 많은지 모르기 때문에 결코 puts()를 사용하지 않는다는 것을 알게되었습니다. – YakRangi

+0

이것에 대해서 :'error : 알 수없는 타입 이름 'off64_t'' –

18

POSIX는 당신이 달성하고자하는 휴대 충분하지 않은 경우, 다음은 현재 디렉토리에있는 파일의 이름을 인쇄합니다 Apache Portable Runtime

+0

으로 변경하면 _findfirst, _findnext 및 _findclose 어딘가에 이미 별칭이 설정되어 있습니까? windows.h에 있지 않습니까? – BuddyJoe

9

디렉토리에있는 파일을 열거하는 표준 C (또는 C++) 방법은 없습니다 :

다음은 C-자주 묻는 질문 대답.

Windows에서는 FindFirstFile/FindNextFile 함수를 사용하여 디렉터리의 모든 항목을 열거 할 수 있습니다. Linux/OSX에서는 opendir/readdir/closedir 함수를 사용하십시오.

+0

Boost :: filesystem ?? – paxos1977

+1

@ceretullis : "표준"이라는 단어에주의하십시오 .. 부스트가 아직 표준이 아닙니다 .. – krebstar

+23

부스트도 C가 아닙니다 –

2

디렉토리 목록은 고려중인 OS/플랫폼에 따라 크게 다릅니다. 이것은 다양한 운영 체제가이를 달성하기 위해 자체 내부 시스템 호출을 사용하기 때문입니다.

이 문제를 해결하려면이 문제를 숨기고 휴대 할 수있는 라이브러리를 찾아야합니다. 불행히도 모든 플랫폼에서 완벽하게 작동하는 솔루션은 없습니다.

POSIX 호환 시스템에서 Clayton이 게시 한 코드를 사용하여이 라이브러리를 사용할 수 있습니다.이 프로그램은 원래 W. Richard Stevens의 UNIX 프로그래밍에서 참조되었습니다. 이 솔루션은 * NIX 시스템에서 작동하며 Cygwin을 설치 한 경우 Windows에서도 작동합니다.

다른 방법으로는 기본 OS를 감지하는 코드를 작성한 다음 해당 OS에서 디렉토리 구조를 나열하는 '적절한'방법을 담고있는 적절한 디렉토리 목록 기능을 호출 할 수 있습니다.

7

GLib는 GTK + 그래픽 툴킷의 기초를 형성하는 C 용 이식성/유틸리티 라이브러리입니다. 독립 실행 형 라이브러리로 사용할 수 있습니다.

디렉토리를 관리하기위한 휴대용 래퍼가 포함되어 있습니다. 자세한 내용은 Glib File Utilities 설명서를 참조하십시오.

개인적으로 나는 GLib와 같은 무언가 없이도 많은 양의 C 코드를 작성하는 것을 고려하지 않을 것입니다. 이식성이 한 가지이지만 데이터 구조, 스레드 도우미, 이벤트, 메인 루프 등을 무료로 가져 오는 것이 좋습니다.

Jikes, 나는 거의 판매원처럼 들리기 시작했습니다 :) (걱정하지 마세요, glib 오픈 소스 (LGPL)와 내가 어떤 방식으로와 제휴 않을거야)

+2

+1; 관련 함수는'g_dir_read_name()' – weiqure

13

이 문제를 다루는 오픈 소스 (BSD) C 헤더를 만들었습니다. 현재 POSIX와 Windows를 지원합니다. 그것을 확인하시기 바랍니다 :

https://github.com/cxong/tinydir

tinydir_dir dir; 
tinydir_open(&dir, "/path/to/dir"); 

while (dir.has_next) 
{ 
    tinydir_file file; 
    tinydir_readfile(&dir, &file); 

    printf("%s", file.name); 
    if (file.is_dir) 
    { 
     printf("/"); 
    } 
    printf("\n"); 

    tinydir_next(&dir); 
} 

tinydir_close(&dir); 
+0

어떻게 원래 시스템에 의존적 인 구현보다 더 많은 도움이됩니까? 아니면 Windows와 POSIX에 하나의 명명 된 라이브러리 만 필요합니까? – kevr

+0

tinydir.h에 대한 '투표'가 완료되었습니다. –

-1

당신은 wikibooks link

/************************************************************** 
* A simpler and shorter implementation of ls(1) 
* ls(1) is very similar to the DIR command on DOS and Windows. 
**************************************************************/ 
#include <stdio.h> 
#include <dirent.h> 

int listdir(const char *path) 
{ 
    struct dirent *entry; 
    DIR *dp; 

    dp = opendir(path); 
    if (dp == NULL) 
    { 
    perror("opendir"); 
    return -1; 
    } 

    while((entry = readdir(dp))) 
    puts(entry->d_name); 

    closedir(dp); 
    return 0; 
} 

int main(int argc, char **argv) { 
    int counter = 1; 

    if (argc == 1) 
    listdir("."); 

    while (++counter <= argc) { 
    printf("\nListing %s...\n", argv[counter-1]); 
    listdir(argv[counter-1]); 
    } 

    return 0; 
} 
관련 문제