readdir 예제

그것은 약간 이상한 구문을 가지고 있지만, 오픈 함수와 유사하지만 두 개의 매개 변수만 허용합니다 : 첫 번째 구문은 디렉토리 핸들을 보유할 아직 정의되지 않은 변수이며 두 번째는 디렉터리에 대한 상대적 또는 절대 경로입니다. 디렉터리 핸들은 파일을 열 때 보았던 파일 핸들과 매우 유사합니다. 고대에 사람들은 이 디렉토리 핸들을 잡기 위해 베어워드를 사용했습니다. 예를 들어 디렉터리의 모든 콘텐츠는 하나의 명령문에서 메모리에서 읽혀지므로 더 많은 메모리를 사용합니다. 반환 된 목록에는 디렉터리에있는 것들의 이름만 포함되어 있기 때문에 파일의 내용을 읽을 때보다 훨씬 적은 문제입니다. readdir()의 반환 값이 아래 예제에서 체크인 방식으로 유의하십시오. 우리는 명시적으로 반환 값이 동일 여부를 테스트하고 있습니다 (동일하고 같은 유형과 같은 -에 대한 자세한 내용은 비교 연산자 참조) FALSE 이후, 그 이름이 FALSE로 평가되는 모든 디렉토리 항목은 루프를 중지합니다 (예 : “0”라는 디렉토리) ). 다른 방법으로는 LIST 컨텍스트에서 readdir를 사용하는 것입니다. 예를 들어 배열에 할당합니다.

이 경우 for 루프를 사용하여 반복 할 수 있습니다 : 그 시점에서 콜백 함수 내부에서 전체 배열을 인쇄 할 수 있습니다 . 예를 들어 각 항목을 인쇄할 수 있습니다. 이 코드는 디렉터리 항목을 읽기 위해 while 루프가 삽입된 이전 예제와 동일합니다. readdir()에서 반환된 값이 NULL이 아닌 한 루프가 회전합니다. 발견된 각 항목에 대해 int 변수 파일은 순차 번호(이 코드의 일부이며 파일 시스템의 일부가 아님)를 추적하고 entry->d_name은 해당 이름을 인쇄합니다. errno와 관련된 더 간단한 방법은 디렉토리 의 끝이 발생할 때 readdir()가 errno를 변경하지 않도록 요구하여 채택되었습니다. 이 스크립트는 명령줄의 디렉터리 경로를 수락하고 필요하게 한 다음 디렉터리의 내용을 나열합니다. (재귀 없이)) readdir() 함수는 인수 dirp에 의해 지정된 디렉터리 스트림의 현재 위치에서 디렉터리 항목을 나타내는 구조에 대한 포인터를 반환하고 다음 항목에 디렉터리 스트림을 배치합니다. 디렉터리 스트림의 끝에 도달하면 null 포인터를 반환합니다.

헤더에 정의된 구조 디렌트는 디렉터리 항목을 설명합니다. 이 식을 함께 말합니다: 명령줄에 값이 있는 경우 $dir 넣습니다. 명령줄에 값이 없는 경우 현재 디렉터리를 나타내는 $dir `.`를 넣습니다. 디렉터리에 100,000개의 파일이 있고 각 파일마다 10자 길이의 이름이 있더라도 여전히 1Mb 메모리에 적합합니다. 성공 시 항목 이름을 반환하거나 실패시 FALSE를 반환합니다. readdir_r() 함수는 성공 시 0을 반환합니다. 오류시, 그것은 긍정적 인 오류 번호 (오류 아래에 나열)를 반환합니다. 디렉터리 스트림의 끝에 도달하면 readdir_r()이 0을 반환하고 NULL을 *result로 반환합니다. 현재 일부 파일 시스템(그 중 Btrfs, ext2, ext3 및 ext4)만 d_type에서 파일 형식을 반환할 수 있습니다. 모든 응용 프로그램은 DT_UNKNOWN의 반환을 올바르게 처리해야 합니다. .

마지막으로 generate_callback이라는 외부 함수가 필요하지 않은 솔루션을 살펴보겠습니다. 디렉터리는 파일과 매우 유사하지만 특수 한 구조를 가지고 있으며 파일과 마찬가지로 “쓰기”만 할 수는 없습니다. 그럼에도 불구하고 “디렉토리”라는이 특별한 내용의 내용을 읽기 전에 운영 체제에 “열기”를 요청해야합니다. 기본적으로 어떻게 든 특정 디렉토리에 우리의 프로세스를 연결합니다. 펄은 이에 대한 오픈디어 함수를 제공합니다.