2017-10-04 27 views
0

최종 업데이트 - 답변이 수락 대답의 견해입니다.dirent.h의 C 사용

우선이 질문에 대한 다른 답변이 많이 있음을 알고 있습니다. 나는 이들 중 대부분을 통과 해 왔으며이 코드는 다른 많은 해답들을 조합 한 것입니다. 내가하고 싶은 일은 디렉토리의 모든 파일에 대한 전체 경로를 얻는 것입니다.

#include <limits.h> 
#include <dirent.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    DIR *d; 
    struct dirent * dir; 
    char fullpath[PATH_MAX + 1]; 
    d = opendir("/home/adirectory"); 
    if(d != NULL) 
    { 
      while((dir = readdir(d)) != NULL) 
      { 
       realpath(dir->d_name, fullpath); 
       printf("[%s]\n", fullpath); 
       printf("%s\n", dir->d_name); 

      } 
      // addition of the following line yields 
      // Value too large for defined data type 
      perror("Something isn't working: "); 
      closedir(d); 

    } 

return 0; 
} 

업데이트 # 3 :

나는 즉시 while 루프 후 perror는 이유 인 dir = readdir(d)입니다 실패 호출. 이것은 CentOS는에 잘 작동

및 우분투 GCC 4.8.5 + :

업데이트 # 2. Solaris gcc 4.5.2에서 작동하지 않습니다.

업데이트 : 오류 메시지가 : 정의 데이터 형식

에 대한

값이 너무 커서 ...하지만이 발생할 수 모르겠어요.

이것은 항상 프로그램을 실행중인 현재 작업 디렉토리를 인쇄합니다. 그렇더라도 실제로는 "."이외의 디렉토리에있는 파일을 나열하지 않습니다. 및 "..". 뭐라 구요? 어떤 종류의 허가 문제가 있습니까? 이 솔루션은 2017 년에 작동하지 않습니까?

+2

컴파일하고 실행 한 상태로 나와 잘 작동합니다. '/ home/adirectory'에 대한 읽기 및 실행 권한을 가지고 있습니까? 'cd/home/adirectory'를 시도해보고'ls'을하고 결과를 얻을 수 있는지보십시오. – lurker

+0

리눅스에서 괜찮습니다. 디렉토리를 내 홈 디렉토리로 변경했습니다. – wallyk

+0

읽기 권한 만 필요합니까? – LBaelish

답변

1

d_name 필드는 가로 지르는 디렉토리의 컨텍스트에서 파일의 이름을 포함합니다. 따라서 어떤 경로도 포함하지 않고 이름 만 포함합니다.

그래서, 당신은 그 경로로 재생하기 위해서는, 당신은, 디렉토리의 이름과 같은를 d_name를 추가하는 데 필요한 다음과 같은 : 물론

char *myHomeDir = "/home/adirectory"; 
d = opendir(myNomDir); 
. . . 
while((dir = readdir(d)) != NULL) { 
    char filepath[PATH_MAX + 1] ; 
    strcpy(filepath, myHomeDir); 
    strcat(filepath, "/"); 
    strcat(filepath, dir->d_name); 
    realpath(filepath, fullpath); 

위의 물건을 그냥 골격이다 명확성을위한 코드. 더 잘 최적화 될 수 있으며 strncpy 패밀리를 사용해야합니다.

+0

현재 작업 디렉토리에 대한 경로를 인쇄하기 전에 올바른 경로로 이동합니다. 그러나 나는 여전히 같은 문제 만 볼 수 있습니다. 및 .. 인쇄 된 및 정의 된 데이터 형식에 대한 큰 오류 메시지 값을 가져옵니다. – LBaelish

+0

컴파일 시간 또는 런타임 메시지입니까? 이전 버전 인 경우 줄 번호를 제공해야합니다. 후자 인 경우 공유 라이브러리가있는 32/64 크기 조합처럼 들립니다. 컴파일과 링크를 위해 '-m32'또는 '-m64'quals를 사용할 수 있습니까? – Serge

+0

와우 그래서'-m64'가이 문제를 해결했습니다! 고맙습니다! 비록 내가 정교하게 신경 쓰면 문제가 정확히 무엇인지 아직도 이해하지 못한다. – LBaelish