andrewrk
그는 물었다 12년 전
56

C 에서 열거합니다 디렉터리입니다 어떻게 할까요?

C 에서 폴더와 파일에 대한 검색 디렉터리입니다 어떻게 해야 할까요? 사용해야 하는지 플랫폼.

답변 10 개

다음 프로그램은 인쇄하십시오 POSIX 파일 이름은 현재 디렉터리입니다.

#define _XOPEN_SOURCE 700
#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

테스트됨 unbuntu 의 16.04.

el.pescado
그는 11년 전 댓글을 달았습니다
1

Windows 에서 함께 노력해야 할 뿐만 아니라, 적어도 이 MinGW.

Tomáš Zato
그는 6년 전 댓글을 달았습니다
0

이건 뭐야. 'error: # 39, & # 39 off64_t& 알 수 없는 유형 이름, '

gwg
그는 6년 전 댓글을 달았습니다
0

난 이미 변경하십시오 '동시에' 조건을 ' (ep = readdir (dp)! = NULL)'

jimo
그는 5년 전 댓글을 달았습니다
0

만약 내가 그냥 @clayton 인쇄하려면 .txt 파일?

bot1131357
그는 4년 전 댓글을 달았습니다
0

Windows*용 디렌트리히 win32 구현 할 수 있습니다. https://github.com/tronkko/dirent. 그냥 &lt 변경하십시오 dirent.h>; &quot 위해 dirent.h";

39;;; 너 같은 엄격한 답이 &quot can& t&quot 매우 总监和首席信息官完全了解 폴더란 진정한 크로스 플랫폼 아니다.

& # 39 의 MS 플랫폼 및 _findclose _findnext _findfirst 사용할 수 있습니다, c& # 39;; 그런 느낌, 그리고 핀드퍼스트피레 및 핀드네스트피레 기본 Win32 있다.

S # 39, here& 캜 faq 대답:

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

Jonathan Leffler
BuddyJoe
그는 8년 전 댓글을 달았습니다
0

이미 설정 및 _findclose _findfirst 앨리어스가 있나요, _findnext 가시나? not in 빈다우스자하 맞죠?

39, ve i& 작성하고 있는 오픈 소스 (BSD) 이 문제를 다루는 C 헤더. 현재는 汲摹窍妨绰 POSIX 및 windo. Dbasyb 아웃해야:

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

kevr
그는 4년 전 댓글을 달았습니다
0

원래 시스템 구축 종속적이지만 보다 더 이상 이 도움말에서는 어떻게 해야 합니까? 아니면, POSIX 라이브러리 (windows*용 release. 수 있도록 한 명만 필요해요?

M.J.Ahmadi
그는 3년 전 댓글을 달았습니다
0

39, & # 39 up& 투표. 티니디스터스 위한, 잘했다.

Joshua
그는 일 년 전 댓글을 달았습니다
0

@kevr: '# 이프데프 티니디스터스 솔루션' 은 거대한 하나의 편리한 헤더 파일.

표준 C (또는 C++) 방법이 없는 열거하십시오 파일 디렉터리입니다.

Windows 에서 모든 기능을 사용할 수 있습니다 / 핀드네스트피레 핀드퍼스트피레 열거하십시오 항목은 디렉터리입니다. Osx / Linux 에서 사용합니다를 opendir / readdir / 클로드리 총괄하였습니다.

krebstar
그는 12년 전 댓글을 달았습니다
2

@ceretullis: 말을해야합니다 기록하십시오 standard&quot ";). 표준 향상시키십시오 아직 없습니다.

Chris Lutz
그는 11년 전 댓글을 달았습니다
27

향상시키십시오 c 도 없습니다.

GLib 은 GTK+ 그래픽 라이브러리 포터블식 / 유틸리티에는 C 의 기반을 형성하는 도구키트. 독립 실행형 라이브러리를 사용할 수 있습니다.

여기에는 이동형이든지 디렉터리용 관리를 위한 래퍼 (wrapper). 참조 유틸리티와의 Glib 파일 문서를 참고하십시오.

개인적으로 더 많은 양의 c 코드 먹어서나 고려해보십시오 wouldn& # 39, t 같은 일이 없이 glib behind me. # 39 는 s 도 있지만, 한 가지는 포터블식 it& afaq 데이터 구조, 잘 알고, 이벤트 등을 무료로 맹룹스 스레드할

제이크스 I& # 39 m, 거의 같은 소리를 하기 시작, 영업 담당이잖아요:) (don& # 39, t 우려가 glib 는 오픈 소스 (LGPL) 및 I& # 39 m not 속해 있는, 어떤 방식으로)

weiqure
그는 10년 전 댓글을 달았습니다
2

+1. 함수 () '는' g_dir_read_name 관련

posix opendir/readdir 있다. Posix 충분하지 않을 경우 대한 포터블식 얻고자 할 때, 확인란 아파치 이동형이든지 런타임용으로 개발하십시오

Os / 플랫폼에 따라 크게 열거합니다 디렉터리입니다 따라 고려 중입니다. 이를 위해서는 다양한 운영 체제 자체의 내부 시스템 호출을 사용하여 없기 때문이다.

이 문제에 대한 해결책을 찾을 수 있는 이 문제와 약간만이라도 라리브러리 마스킹하고 이동형이든지. 모든 플랫폼에서 작동하는 원활한 실행을 죄송합니다. 해결 방법이 없다.

Posix 호환 시스템의 경우, 이를 위해서는 코드를 사용할 수 있는 라이브러리를 사용하여 게시자 클레이턴 (원하는거요 referenced 메뉴의 고급 프로그래밍 UNIX 에서 책이다 당초 W. 리차드 스티븐스요). 이 솔루션은 Windows 에서 맥 * NIX 따라 일할 경우 시스템 및 또한 작동합니까 설치되었음.

또는 코드를 작성할 수 있습니다 다음 해당 디렉토리 목록을 발견할 수 있는 기능을 기본 OS & # 39 를 열겠다고 호출하십시오 proper& # 39;; 디렉토리 구조를 열거합니다 길을 따라 해당 OS.

그러나 운행에서어떠한 can& 말 것 같아요 # 39, t hold 있어요.

Int (char *) 'C' 를 사용하여 시스템을 통해 할 수 있는 모든 종류의 물건을 &quot portable"; 캜 인터페이스입니다. 특정 언어의 했습니다 읽어들입니다 응용 프로그램과 시스템 (예를 들면 쉘로 / Bash, DOS, PowerShell) 이지만, 적어도 실망에는 won& # 39, 추가 라이브러리를 연결할 필요는 없다. ',' 와 달리 모든 종류의 &quot, 플랫폼 independent&quot 디렌트 할 수 있습니다. 그런거 centera 를 사용하고 있습니다.

예 디렉터리용 열거합니다 리눅스로 (대부분 dtep):

system("ls . > some_file_or_pipe_or_whatever") //
fscanf(file_or_pipe_or_whatever, "%s", a_line_from_ls);

Jean-François Fabre
그는 일 년 전 댓글을 달았습니다
0

또한, 'ls' s not 이동형이든지 it& # 39 로 doesn& 타임코드가 t # 39, 기본적으로 모든 플랫폼에서 (windows)

샘플 코드 진단트리로 위키책 https://partner. 에서 찾을 수 있습니다

/**************************************************************
 * 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;
}