C의 폴더 및 파일에 대한 디렉토리를 어떻게 검사합니까? 그것은 크로스 플랫폼이어야합니다.C로 디렉토리 목록을 얻는 방법은 무엇입니까?
답변
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)
을 확인 엄밀한 대답은 폴더의 개념이 진정한 크로스 플랫폼이 아니기 때문에 "할 수 없다"입니다.
MS 플랫폼에서는 _findfirst, _findnext 및 _findclose를 사용하여 'c'종류의 느낌을주고 FindFirstFile 및 FindNextFile을 기본 Win32 호출에 사용할 수 있습니다.
POSIX는 당신이 달성하고자하는 휴대 충분하지 않은 경우, 다음은 현재 디렉토리에있는 파일의 이름을 인쇄합니다 Apache Portable Runtime
으로 변경하면 _findfirst, _findnext 및 _findclose 어딘가에 이미 별칭이 설정되어 있습니까? windows.h에 있지 않습니까? – BuddyJoe
디렉토리에있는 파일을 열거하는 표준 C (또는 C++) 방법은 없습니다 :
다음은 C-자주 묻는 질문 대답.
Windows에서는 FindFirstFile/FindNextFile 함수를 사용하여 디렉터리의 모든 항목을 열거 할 수 있습니다. Linux/OSX에서는 opendir/readdir/closedir 함수를 사용하십시오.
디렉토리 목록은 고려중인 OS/플랫폼에 따라 크게 다릅니다. 이것은 다양한 운영 체제가이를 달성하기 위해 자체 내부 시스템 호출을 사용하기 때문입니다.
이 문제를 해결하려면이 문제를 숨기고 휴대 할 수있는 라이브러리를 찾아야합니다. 불행히도 모든 플랫폼에서 완벽하게 작동하는 솔루션은 없습니다.
POSIX 호환 시스템에서 Clayton이 게시 한 코드를 사용하여이 라이브러리를 사용할 수 있습니다.이 프로그램은 원래 W. Richard Stevens의 UNIX 프로그래밍에서 참조되었습니다. 이 솔루션은 * NIX 시스템에서 작동하며 Cygwin을 설치 한 경우 Windows에서도 작동합니다.
다른 방법으로는 기본 OS를 감지하는 코드를 작성한 다음 해당 OS에서 디렉토리 구조를 나열하는 '적절한'방법을 담고있는 적절한 디렉토리 목록 기능을 호출 할 수 있습니다.
GLib는 GTK + 그래픽 툴킷의 기초를 형성하는 C 용 이식성/유틸리티 라이브러리입니다. 독립 실행 형 라이브러리로 사용할 수 있습니다.
디렉토리를 관리하기위한 휴대용 래퍼가 포함되어 있습니다. 자세한 내용은 Glib File Utilities 설명서를 참조하십시오.
개인적으로 나는 GLib와 같은 무언가 없이도 많은 양의 C 코드를 작성하는 것을 고려하지 않을 것입니다. 이식성이 한 가지이지만 데이터 구조, 스레드 도우미, 이벤트, 메인 루프 등을 무료로 가져 오는 것이 좋습니다.
Jikes, 나는 거의 판매원처럼 들리기 시작했습니다 :) (걱정하지 마세요, glib 오픈 소스 (LGPL)와 내가 어떤 방식으로와 제휴 않을거야)
+1; 관련 함수는'g_dir_read_name()' – weiqure
가장 유사한 방법 readdir
에 아마 작은 알려진 _find
family of functions을 사용하고있다.
이 문제를 다루는 오픈 소스 (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);
어떻게 원래 시스템에 의존적 인 구현보다 더 많은 도움이됩니까? 아니면 Windows와 POSIX에 하나의 명명 된 라이브러리 만 필요합니까? – kevr
tinydir.h에 대한 '투표'가 완료되었습니다. –
당신은 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;
}
에 샘플 코드를 찾을 수 있습니다이 적어도는 MinGW와 함께뿐만 아니라 Windows에서 작동합니다. –
@ 클레이튼하지만 인쇄 할 문자가 얼마나 많은지 모르기 때문에 결코 puts()를 사용하지 않는다는 것을 알게되었습니다. – YakRangi
이것에 대해서 :'error : 알 수없는 타입 이름 'off64_t'' –