2012-04-30 3 views
0

를 사용하여 읽는 동안 디렉토리를 생략하는 방법 : 내가 실패한 디렉토리를 건너 뛰도록 만들 수 없습니다 을 열기 위해. 내가 할 수있는 디렉토리를 열어서 실패 할 수없는 디렉토리를 건너 뛰고 실패로 끝나는 대신 다음 디렉토리로 이동하기를 원합니다. 이 문제를 해결하려면 어떻게해야합니까? 여기 내가</strong></p> <p>내 문제가 <strong>dirent.h를에서 제공하는 기능을 사용하여 재귀 적으로 파일을 열 노력하고 dirent.h를

내가 windows 7에이 같은 스타일을 사용

int acessdirs(const char *path) 
{ 
    struct dirent *entry; 
    DIR *dp; 
    char fpath[300]; 
    if(dp=opendir(path)) 
    { 
     while((entry=readdir(dp))) 
      do things here 
    } 
    else 
    { 
     std::cout<<"error opening directory"; 
     return 0; 
    } 
    return 1; 
} 

를 사용하려고 간단한 코드이며, 그것은 windows xp에 추락 됐었 작동하고 내가 그것을 디버깅 할 때 내가하려고하는 동안 충돌 발견 "system volume information"을여십시오. 난 정말이 폴더에 액세스 할 필요가 없으며 그것을 건너 뛸 방법이 있다면 나는 기대했다.

내 실제 코드는 다음과 같습니다.

조금 깁니다.

int listdir(const char *path) 
{ 
    struct dirent *entry; 
    DIR *dp; 

    if(dp = opendir(path)) 
    { 
    struct stat buf ; 

    while((entry = readdir(dp))) 
    { 
     std::string p(path); 
     p += "\\"; 
     p += entry->d_name; 
     char fpath[300]; 
     if(!stat(p.c_str(), &buf)) 
     { 
      if(S_ISREG(buf.st_mode)) 
      { 
       sprintf(fpath,"%s\\%s",path,entry->d_name); 
       stat(fpath, &buf); 
       std::cout<<"\n Size of \t"<<fpath<<"\t"<<buf.st_size; 
       fmd5=MDFile (fpath);   
      }//inner second if 
      if(S_ISDIR(buf.st_mode) && 
     // the following is to ensure we do not dive into directories "." and ".." 
         strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")) 
      { 
       listdir(p.c_str()); 
      } 
     }//inner first if 
     else 
      std::cout << "ERROR in stat\n"; 
    }//end while 
    closedir(dp); 
    }//first if 
    else 
    { 
     std::cout << "ERROR in opendir\n"; 
     return 0; 
    } 
    return 1; 

}//listdir() 
+0

'access'는 두 개의 'c'로 표기됩니다. – hochl

+0

이 코드는 어떻게 컴파일됩니까? 당신은'dip'이라는 변수를 가지고 있고 이것을'dp'라고 부릅니다. 또한 앞으로는 이해할 수 있도록 코드를 들여 씁니다. – Celada

+0

문제가있는 곳을 이해하는 데 너무 적은 코드를 붙여 넣었습니다. 'accessdirs'가 루프에서 호출됩니까? '0'이 반환되면 루프가 무엇을합니까? 재귀는 정확히 어디에 있습니까? "여기에있는 일"이 "액세스 디렉토리"를 호출합니까? –

답변

1

당신의 가장 큰 문제는 여기에있을 것 같다 :

sprintf(fpath,"%s\\%s",path,entry->d_name); 
stat(fpath, &buf); 

fpath의 declatation을 보지 않고, 그것은 확실히 말할 힘든,하지만 당신은 것 중 하나

  • fpath을 넘쳐 sprintf 호출에서 정의되지 않은 동작이 발생합니다. "시스템 볼륨 정보"는 긴 이름입니다. 실제로는 snprintf을 사용해야합니다.

  • stat 호출의 반환 값을 확인하지 않습니다. -1을 반환하는 경우 buf의 내용이 확실하지 않습니다. 당신이 POSIX의 물건을 사용할 수 있는지

더 중요한 것은, 기능 ftw 표준이며, 여기에 구현하려고하는 대부분의 기능을 제공해야한다.

+0

죄송합니다. 나는 지금까지 떨어져 있었다. 나는 ** fpath **에 대한 선언문을 넣었다. – user1366861