2016-11-26 8 views
2

dirent.h를 사용하는 방법을 배우고 있습니다. 프로세스가 흥미롭고 흥미 롭지 만 d_name을 사용할 때 문제가 발생했습니다.C++ dirent.h 및 절대 경로 얻기위한 구문

d_name을 사용하여 두 가지 작업을 수행하려고합니다.

  1. 서브 디렉토리를 재귀 적으로 검색하십시오. 내가 DT_DIR 유형의 파일을 발생할 때까지, 나는 새로운 문자 * 파일 경로 매개 변수로 디렉토리의 d_name를 사용하여 자체 내에서 기능

    void iterateDirectory(char* filePath){ 
    DIR* dirPtr; 
    dirent* entry; 
    entry = readdir(dirPtr); 
    ... 
    } 
    

    에 재귀 호출을 만들 것입니다. 따라서

    if(dirEntry->d_type == DT_DIR){ 
    entry->d_name; 
    iterateDirectory(entry->d_name); 
    ... 
    } 
    
  2. 디렉토리 내의 모든 파일을 엽니 다. 이렇게하려면 DT_REG 파일을 만날 때 ifstream 개체를 만들고 d_name을 사용하여 파일을 엽니 다. 그래서,

    if(dirEntry->d_type == DT_REG){ 
    entry->d_name; 
    ifstream fin(entry->d_name); 
    if(fin.is_open) 
        cout<<"Opened"<<endl; 
    else 
        cout<<"Not Opened"<<endl; 
    ... 
    } 
    

내가으로 실행하고 문제

은 무효 iterateDirectory() 함수 나 ifstream 지느러미()도 유효한 입력으로 초급> d_name 인식하는 것으로 보인다는 것이다. d_name을 사용하여 iterate 함수를 호출하거나 ifstream을 entry-> d_name과 함께 사용하면 디렉토리 나 파일이 열려 있는지 확인합니다. 다른 char * 입력으로 똑같은 함수를 검사 했으므로 함수 자체가 작동합니다. 내가 생각할 수있는 유일한 문제는 함수가 절대 경로를 매개 변수로 사용하지 않는다는 것입니다.

제 질문은 어떻게 주어진 파일이나 하위 디렉토리의 반복 지점에서 찾을 수 있습니다. 나의 초기 해결책은 "."을 사용하는 것이 었습니다. 현재 디렉토리입니다. "."의 주소를 저장하십시오. 문자열에 추가하고 "\"+ entry-> d_name을 추가하십시오. 하지만 구문이 잘못되었다고 생각합니다.

절대 경로 문제에 관해서는 맞습니까? 또는 내가 놓친 다른 문제가 있습니까? 절대 경로 문제인 경우 파일의 절대 경로를 가져 오는 구문은 무엇입니까?

P.

나는 과거에 질문에 대한 스택 오버플로에 업로드하는 코드의 양을 최소화하기 위해 정보를 얻었으며 필자는 필요한 코드가 가장 작은 코드를 제시했습니다. 위에 제시된 정보가 충분하지 않은 경우 코드에 github 페이지를 연결합니다. 모든 모든 도움이

https://github.com/ForeverABoy/dirent.h_practice/blob/master/directoryIterator.cpp

을 부탁드립니다. 고맙습니다!

+0

'd_name'은 디렉토리에있는 파일의 이름입니다. "foo/bar"의 * filePath *를 opendir()했을 때, 그리고'dname'이 "baz"인 경우, 그 파일을 열려면 분명히 "foo/bar/baz"를 열어야합니다. 'd_name'에서 볼 수 있습니다. –

+0

Sam, 도움 주셔서 감사합니다. 나는 문제가 절대 경로와 함께 있다는 것을 알고 있으며 주어진 입력으로부터 디렉토리의 절대 경로를 얻는 방법을 찾으려고 노력하고있다. 때문에 realpath (entry-> d_name, buffer)를 사용하면 도움이되지 않았습니다. 1. realpath는 입력 디렉토리 대신 내 코드의 빌드 디렉토리를 제공합니다. 2. 파일 빌드 디렉토리의 경우에도 하위 디렉토리의 주소는 업데이트되지 않습니다. foo에서 foo/bar로 이동 한 후 baz를 검색하면 realpath()가 foo/bar/baz 대신 foo/baz를 제공합니다. –

+1

*** 디렉토리 이름 ***에'realpath()'를 사용하여 디렉토리의 절대 경로를 가져옵니다. 그런 다음'd_name'을 추가하십시오. –

답변

0

Sam Varshavchik 덕분에 문제를 파악했습니다.

실제로 전체 경로 이름을 사용하여 함수를 호출하지 않는 것이 문제였습니다. 나는 이것을 알고 즉시 realpath()로 고치려고했다. 문제는 디렉토리 이름 대신에 엔트리 -> d_name에 realpath를 사용하고 있다는 것이 었습니다.

realpath(entry->d_name, buffer); 

입력 된 디렉터리 대신 빌드 디렉터리가 반환되었습니다. 코드를 실행하는 동안 변수 d_name의 경로가 실제로 빌드 디렉토리에 있기 때문이라고 가정합니다.

char* fullPath = realpath(inputPath, buffer); 

입력 한 실제 경로가 표시됩니다.거기에서, 나는 단지 경로를 문자열로 바꾸었고 디렉토리 나 파일을 만났을 때 경로를 추가했다.

감사합니다. Sam. 당신 말이 맞아요. realpath() 매뉴얼이 말한 것을 읽고 충분히 이해했을 때, 모두 의미가있었습니다.