2011-09-01 3 views
3

나는 수업을위한 프로그램을 만들고 있는데, 나는 약간의 코드에 대한 결과물에 대해 궁금해한다. 좀과 같은 코드가 있습니다C에 "Double dot"디렉토리 이름이 있습니까?

DIR* dir = opendir("."); 
struct dirent* reader; 

while ((reader = readdir(dir)) != NULL) 
{ 
//print the name of the path found by reader. 
} 

이제이 잘 작동하고 모든,하지만 난 처음 두 옵션 항상 통지 :

. 
.. 
//rest of files here 

는 이제 첫 번째 점 .는 단순히 있으리라 믿고있어 현재 디렉토리의 이름이지만 두 번째 이중 점은 무엇입니까? 나는 cd ..을 사용하여 파일 계층 구조를 구성 할 수 있지만 서브 디렉토리 이름을 읽을 때 출력되는 이유를 알지 못합니다.

나는 모든 파일을 반복적으로 살펴보고 싶지만, ..을 통해 들어가면 첫 번째 디렉토리 이름은 .이며 루프가 발생합니다. 어떻게 이것을 피할 수 있습니까?

+1

파일 시스템 자체에서 온 것입니다. –

답변

6

..은 상위 디렉토리입니다. 파일 시스템 루트에 있지 않으면 루트 디렉토리와 동일합니다.

기본적으로 dir 변수가 . 또는 ..과 같은지 확인하고 싶습니다. 그럴 경우 해당 디렉토리를 건너 뜁니다.

루프를 while 루프에 넣거나 디렉터리 배열에서이 두 디렉터리를 필터링하여이 작업을 수행 할 수 있습니다.

오 그래, 여전히 유효한 디렉토리이기 때문에 .으로 시작하는 디렉토리를 실수로 건너 뛰지 않았는지 확인하십시오. 전체 디렉토리 이름이 . 또는 ..인지 확인하십시오.

2

디렉토리 구조로 내려갈 때 재귀를 제한하는 것이 중요합니다. . (현재 디렉토리) 및 .. (상위 디렉토리)을 무시하는 것만으로는 충분하지 않지만 (그러나 쓸모없는 여행은 피하십시오. symlink 파일 인 foo.에 링크되어 있다고 가정하면 - .과 동일한 효과를 나타냅니다.

심도 카운트 또는 "봤어 디렉토리"또는 구조 (스마트 구현은주기를 감지하고 제거 할 수 있음)를 유지하십시오. 또한 readlink을 사용하여 대상을 검사하는 것도 고려하십시오. (참고로 hardlinks to directories can be created in OS X을 사용하면 readlink가 도움이되지만 다른 경비원의 필요성은 생략하지 않습니다.)

해피 코딩.