programing

C에서 디렉토리 목록을 얻으려면 어떻게 해야 하나요?

sourcetip 2022. 7. 12. 00:11
반응형

C에서 디렉토리 목록을 얻으려면 어떻게 해야 하나요?

디렉토리에서 C 폴더와 파일을 스캔하려면 어떻게 해야 합니까?크로스 플랫폼이어야 합니다.

다음의 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

Ubuntu 16.04로 테스트.

폴더라는 개념 자체가 진정한 크로스 플랫폼이 아니기 때문에 엄밀한 대답은 "할 수 없습니다"입니다.

MS 플랫폼에서는 findfirst, findnext 및 findclose를 사용하여 c의 느낌을 얻을 수 있으며 FindFirstFile 및 FindNextFile은 기본 Win32 콜에 사용할 수 있습니다.

C-FAQ의 답변은 다음과 같습니다.

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

이 문제에 대처하는 오픈소스(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);

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

Windows 에서는, FindFirstFile/FindNextFile 함수를 사용하고, 디렉토리내의 모든 엔트리를 열거할 수 있습니다.Linux/OSX에서 opendir/readdir/closedir 함수를 사용합니다.

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

디렉토리 관리를 위한 휴대용 래퍼가 포함되어 있습니다.상세한 것에 대하여는, Glib File Utilities 의 메뉴얼을 참조해 주세요.

개인적으로는 뒤에 GLib 같은 것이 없으면 대량의 C-code를 쓸 생각도 하지 않습니다.휴대성도 중요하지만 데이터 구조, 스레드 헬퍼, 이벤트, 메인루프 등을 무료로 받을 수 있어 좋습니다.

이런, 거의 영업사원처럼 들리네요:) (걱정 마세요.glib은 오픈소스(LGPL)이기 때문에 저는 어떤 관계도 없습니다.)

opendir/readdir는 POSIX입니다.POSIX로 휴대성이 충분하지 않은 경우 Apache Portable Runtime을 선택하십시오.

디렉토리의 일람은, 검토중의 OS/플랫폼에 따라서 크게 다릅니다.이는 다양한 운영체계가 이를 위해 자체 내부 시스템 호출을 사용하기 때문입니다.

이 문제의 해결책은 이 문제를 숨기고 휴대할 수 있는 라이브러리를 찾는 것입니다.유감스럽게도 모든 플랫폼에서 완벽하게 작동하는 솔루션은 없습니다.

POSIX 호환 시스템에서는 Clayton이 게시한 코드(원래 W. Richard Stevens가 UNIX 책 아래의 Advanced Programming에서 참조)를 사용하여 라이브러리를 사용할 수 있습니다.이 솔루션은 *NIX 시스템에서 동작하며 Cygwin이 설치되어 있는 경우 Windows에서도 동작합니다.

또, 기반이 되는 OS 를 검출하는 코드를 작성해, 그 OS 로 디렉토리 구조를 「적절하게」 리스트 하는 방법을 보관 유지하는 적절한 디렉토리 리스트 함수를 호출할 수도 있습니다.

와 가장 유사한 방법readdir아마 잘 알려지지 않은 기능군을 사용하고 있을 겁니다.

샘플 코드는 Wikibooks 링크에서 찾을 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/12489/how-do-you-get-a-directory-listing-in-c

반응형