2009-05-22 4 views
0

주어진 디렉토리 경로의 모든 파일을 재귀 적으로 나열 할 수있는 휴대용 파일 시스템 스캐너를 작성하려고합니다.Cygwin을 사용한 C++ 재귀 파일/디렉토리 검색

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

int main(void) 
{ 
    DIR   *d; 
    struct dirent *dir; 
    d = opendir("."); 
    if (d) 
    { 
    while ((dir = readdir(d)) != NULL) 
    { 
     // Stuff 
    }  
    closedir(d); 
    }  
    return(0); 
} 

을 그러나뿐만 아니라 검색 재귀 디렉토리를 추가해야합니다

내가, 내 컴파일러 Cygwin에서 사용하려고 시도하는 dirent.h를 사용을하고 템플릿을 사용하고,이 작업을 수행합니다. 이렇게하려면 내 해결책은 다음 파일에 opendir()을 시도한 다음 오류 코드를 판단하여 디렉토리가 성공적으로 열렸는지 여부를 판별 한 후 (다시 검색 할 때) 또는 ' 디렉토리 '로 표시되며, 파일로 표시됩니다.

나는 그것이 매우 klugey라고 느낀다는 것을 인정하지만 나는 수 시간의 검색 후에도 이식성 (win32가 아님)을 유지할 수있는 더 나은 방법을 찾을 수 없었다.

이 같은

그래서 내 간단한 솔루션 (단순 일부 사이비)를 찾고 뭔가 : 나는 매우 해요하지만 (

 
int scan(string startdir) 
{ 
    DIR   *d; 
    struct dirent *dir; 
    d = opendir(startdir.cstr()); 
    if (d) 
    { 
    while ((dir = readdir(d)) != NULL) 
    { 
     if(NOT '.' AND NOT '..') 
     { 
     if(temp = opendir(startdir + d) == NULL) 
     { 
      //FILE OR ERROR 
     }else{ 
      //Opened successfully as a directory, so recurse 
      scan(startdir + d->d_name + "\\"); 
     } 
     } 
    } 
    closedir(d); 
    } 
    return(0); 
} 

이 절반 다시 작성 사이비 코드를 간단하게 할 수 있지만, 그것을 작동하는 것 같다 이것을하기위한 더 좋은 방법에 대한 제안을 열어 라.)

그러나 중요한 문제는 특정 링크 파일 'c : \ cygwin \ dev \ fd'입니다.이 링크는 디렉토리로 열리고 반복적으로 반복적으로 반복해서 열리는 것으로 보입니다.

'fd'파일은 확장자가없는 4KB이며 106 바이트이며 Windows의 어느 부분도 가리 키지 않는 바로 가기입니다.

이 오류는 하나이 kludgey 방법은 도청을 나타 내기 위해 것, 또는 내가에서 컴파일하고있어 Cygwin에서 구현에 문제가있다 짧은 예를 들어

:.

Error Reading: c:\cygwin\dev\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\0 No such file or directory

것을 제외 검색 결과가 잘 작동하는 것 같습니다. 그러나 나는 스캐너에 배타적 인 코딩을하지 않아도 괜찮습니다.

누구든지이 문제에 대한 아이디어, 제안, 해결책 또는 다른 방법이있는 경우 귀하의 의견을 보내 주시면 감사하겠습니다.

감사합니다.

답변

1

범인은 내가 보장하지 않습니다

/proc 디렉토리에 FD 파일 링크가/진실한 것 같다,하지만 난이 자신의 디렉토리 구조를 통해 재귀 루프 스캐너를 수 있다는 인상이다 .

이 문제를 해결하기위한 readlink()의 ​​노력은 처음 이었지만, 더 깊은 수준의 검사를 수행하면 신뢰할 수없고 오류가 계속 발생할 수 있다는 것을 알게되었습니다.

지금이 기능을 구현하는 다른 방법을 찾고 있습니다 (예 : boost :: filesystem).

0

이것은 심볼릭 링크가있는 가상 파일 시스템입니다. Cygwin은 심볼릭 링크를 지원합니다. 따라서이를 고려해야합니다.

1

부스트를 사용할 수 있다면 boost::filesystem을 사용해보십시오. 자습서에는 재귀 적으로 쉽게 작업을 확장 할 수있는 간단한 ls 프로그램이 포함되어 있습니다. 라이브러리에는 파일 유형을 조회하는 메소드가 포함되어있어 특정. 제점을 해결할 수 있습니다.

+0

아마 좋은 생각 일 것이지만, 더 높은 업에서 더 이상의 토론과 승인을 필요로하는 다른 라이브러리 (무료 라이브러리 포함)를 사용하는 것은 주저합니다. 나는 그것을 더 자세히 살펴보고 (다른 곳에서도 언급했듯이) 아마도 피치를 만들 것이다. 의견을 보내 주셔서 감사합니다 – KevenK

0

cygwin에 모든 유닉스 도구가 있다는 것을 알고 계실 것입니다.

찾기는 매우 유용합니다.

0

cygwin 라이브러리에는 ftw()와 fts()가 둘 다 있습니다. 그 중 하나를 사용하십시오.

0

예에서 opendir()을 다시 사용하여 파일 또는 디렉토리인지 확인했습니다. "sys/stat.h"의 stat()를 사용하면보다 직접적으로이 작업을 수행 할 수 있습니다. 이것은 Cygwin에서도 사용할 수 있습니다. 매크로 S_ISREG() 및 S_ISDIR()을 사용하여 일반 파일이나 디렉토리를 확인할 수 있습니다. 이 같은 아마 뭔가 :

struct stat *buf = new struct stat; 
    if(!stat(d->d_name, buf)) 
    { 
     if(S_ISREG(buf->st_mode)) 
     { 
      std::cout << " File: " << entry->d_name << "\n"; 
     } 
     if(S_ISDIR(buf->st_mode) && 

또한 내가 다른 question에 제공 한 answer에서 참조하시기 바랍니다.