2011-11-11 4 views
1

readdir는 디렉토리 내의 모든 항목에 대한 정보를 반환합니다. 항목이 파일인지 디렉토리인지 어떻게 알 수 있습니까?readdir : 파일 또는 디렉토리인지 어떻게 알 수 있습니까?

감사합니다.

EDIT. 죄송합니다. 내 시간 타겟 플랫폼이 iOS 및 Android임을 언급하는 것을 잊어 버렸습니다.

+0

'readdir'이 iOS 응용 프로그램에서 사용 가능한지 잘 모르겠습니다. 어쨌든, 그 플랫폼에서 NSFileManager와 디렉토리를 식별 할 수있는'-fileType' 헬퍼 메소드를 사용하면 더 잘 서비스 할 수있을 것이다. –

+0

그것을 들여다 보면'readdir'이 iOS에서 사용할 수있는 것처럼 보입니다. 그러나 iOS 4.x에서 구현 된 버그가 있습니다 : https://devforums.apple.com/message/251591. 여전히 NSFileManager의 상위 레벨 추상화를 사용하는 것이 좋습니다. –

답변

6

d_typeD_DIR인지 확인하십시오.

+0

POSIX를 준수하지 않습니다. – pic11

+0

@ pic11, Basile의 답변에 대한 내 의견을 참조하십시오. –

+0

'd_type'을 사용하면 모든 항목에 대해'stat'를 호출하는 것보다 50-1000 배 정도 빠르지 만'd_type'이 존재하지 않는 시스템이나 채워지지 않은 시스템에 대체 코드를 포함시켜야합니다. –

0

또한 디렉토리의 각 항목에 대한 경로를 계산할 수 있습니다 (하지만 아마 당신은 . & .. 항목을 건너 뛸 수 있습니다) 그 경로에 stat 시스템 호출을 사용합니다.

경로에 자세한 정보 (예 : 수정 시간, 크기, ...)가 필요한 경우 유용합니다.

+0

'd_type'을 지원하지 않는 시스템의 경우에도 유용 할 수 있습니다. 질문은 'linux' 태그가 붙어 있기 때문에 가능합니다. , 문제가되지는 않을 것입니다. –

+1

경로를 계산할 필요가 없습니다. (적어도 리눅스에서는> 2.6.16이 아닙니다.) readdir이 사용되고 있기 때문에 d_name에 주어진 상대 경로와 함께 fstatat를 사용할 수 있도록 열려있는 dirent가 이미 있습니다. (fd를 얻으려면 dirfd()를 사용하십시오). –

+0

네, 맞습니다. 하지만 나는'fstatat'가 덜 이식 될 수 있다고 믿을 것이다. –

1

에 dirent는 그렇게하는 파일 인 경우 0x8이로 평가 될 수있는 회원 d_type이 포함

struct dirent *DirEntry; 
... 
if (DirEntry->d_type == 0x8) 
     //is a file 
1

그것은 표준 "POSIX"readdir은 작업에 따라 당신은 필드 d_type

이 없습니다

POSIX에 따르면 dirent 구조체는 지정되지 않은 크기의 필드 char d_name [], 종료 Null 바이트보다 NAME_MAX 자 이하의 문자를 포함합니다. POSIX.1-2001 또한 ino_t d_ino 필드를 XSI 확장으로 문서화합니다. other> 필드를 사용하면 프로그램의 이식성이 떨어집니다.

표준 방법은 파일/dir에서 lstat 호출을 수행하고 st_mode가 S_ISDIR과 일치하면 struct stat의 st_mode 필드를 확인하는 것입니다.

관련 문제