readdir는 디렉토리 내의 모든 항목에 대한 정보를 반환합니다. 항목이 파일인지 디렉토리인지 어떻게 알 수 있습니까?readdir : 파일 또는 디렉토리인지 어떻게 알 수 있습니까?
감사합니다.
EDIT. 죄송합니다. 내 시간 타겟 플랫폼이 iOS 및 Android임을 언급하는 것을 잊어 버렸습니다.
readdir는 디렉토리 내의 모든 항목에 대한 정보를 반환합니다. 항목이 파일인지 디렉토리인지 어떻게 알 수 있습니까?readdir : 파일 또는 디렉토리인지 어떻게 알 수 있습니까?
감사합니다.
EDIT. 죄송합니다. 내 시간 타겟 플랫폼이 iOS 및 Android임을 언급하는 것을 잊어 버렸습니다.
d_type
이 D_DIR
인지 확인하십시오.
POSIX를 준수하지 않습니다. – pic11
@ pic11, Basile의 답변에 대한 내 의견을 참조하십시오. –
'd_type'을 사용하면 모든 항목에 대해'stat'를 호출하는 것보다 50-1000 배 정도 빠르지 만'd_type'이 존재하지 않는 시스템이나 채워지지 않은 시스템에 대체 코드를 포함시켜야합니다. –
또한 디렉토리의 각 항목에 대한 경로를 계산할 수 있습니다 (하지만 아마 당신은 .
& ..
항목을 건너 뛸 수 있습니다) 그 경로에 stat 시스템 호출을 사용합니다.
경로에 자세한 정보 (예 : 수정 시간, 크기, ...)가 필요한 경우 유용합니다.
'd_type'을 지원하지 않는 시스템의 경우에도 유용 할 수 있습니다. 질문은 'linux' 태그가 붙어 있기 때문에 가능합니다. , 문제가되지는 않을 것입니다. –
경로를 계산할 필요가 없습니다. (적어도 리눅스에서는> 2.6.16이 아닙니다.) readdir이 사용되고 있기 때문에 d_name에 주어진 상대 경로와 함께 fstatat를 사용할 수 있도록 열려있는 dirent가 이미 있습니다. (fd를 얻으려면 dirfd()를 사용하십시오). –
네, 맞습니다. 하지만 나는'fstatat'가 덜 이식 될 수 있다고 믿을 것이다. –
에 dirent는 그렇게하는 파일 인 경우 0x8이로 평가 될 수있는 회원 d_type이 포함
struct dirent *DirEntry;
...
if (DirEntry->d_type == 0x8)
//is a file
그것은 표준 "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 필드를 확인하는 것입니다.
'readdir'이 iOS 응용 프로그램에서 사용 가능한지 잘 모르겠습니다. 어쨌든, 그 플랫폼에서 NSFileManager와 디렉토리를 식별 할 수있는'-fileType' 헬퍼 메소드를 사용하면 더 잘 서비스 할 수있을 것이다. –
그것을 들여다 보면'readdir'이 iOS에서 사용할 수있는 것처럼 보입니다. 그러나 iOS 4.x에서 구현 된 버그가 있습니다 : https://devforums.apple.com/message/251591. 여전히 NSFileManager의 상위 레벨 추상화를 사용하는 것이 좋습니다. –