IT박스

C로 디렉토리 목록을 어떻게 얻습니까?

itboxs 2021. 1. 6. 07:56
반응형

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 파일 유틸리티 문서를 참조하십시오.

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

Jikes, I'm almost starting to sound like a sales guy :) (don't worry, glib is open source (LGPL) and I'm not affiliated with it in any way)


opendir/readdir are POSIX. If POSIX is not enough for the portability you want to achieve, check Apache Portable Runtime


Directory listing varies greatly according to the OS/platform under consideration. This is because, various Operating systems using their own internal system calls to achieve this.

A solution to this problem would be to look for a library which masks this problem and portable. Unfortunately, there is no solution that works on all platforms flawlessly.

On POSIX compatible systems, you could use the library to achieve this using the code posted by Clayton (which is referenced originally from the Advanced Programming under UNIX book by W. Richard Stevens). this solution will work under *NIX systems and would also work on Windows if you have Cygwin installed.

Alternatively, you could write a code to detect the underlying OS and then call the appropriate directory listing function which would hold the 'proper' way of listing the directory structure under that OS.


The most similar method to readdir is probably using the little-known _find family of functions.


You can find the sample code on the 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;
}

Way late but guess I can't hold myself...

Using the C int system(char*) you can do all kinds of stuff through a "portable" C-interface. You would have to load the application with the system specific language (e.g. Shell/Bash, DOS, PowerShell), but at least you won't need to link extra libraries. AND, in contrast to dirent, you can do all sorts of "platform independent" stuff using it.

Example of listing directories with linux (mostly pseudo):

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

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

반응형