티스토리 뷰

이번 글에서는 root directory에서 출발하여 특정 디렉토리에 어떤 하위디렉토리와 파일들이 있는지 알아보는 방법에 대해서 설명하도록 하겠다.

이를 위하여 두개의 API를 만들어볼 예정이다.

먼저 특정 디렉토리를 선택하기 위한 fat32_opendir()과 선택된 디렉토리에서 차례차례로 directory entry를 가져오기 위한 fat32_readdir() 함수이다.

먼저, FAT32 파일 시스템의 기본 파라미터와 디렉토리 관리를 위한 구조체를 만들어 보도록 하겠다.

전체를 총괄하는 fat32_info 구조체가 있고, 그 안에 SD 메모리카드의 FAT32 파일시스템의 주요 파라미터를 저장하기 위한 disk_info가 있고, 이번 글에서 많이 다루게 될 디렉토리 관련 파라미터를 저장하기 위한 dir_info 구조체가 있다. 그리고, 마지막으로 다음 글에서 다룰 파일을 관리하기 위한 file_info 구조체가 있다.

먼저, boot record에서 읽어 들인 주요 파라미터를 disk_info 구조체에 넣어 주는 코드를 다음과 같이 만든다.

여기에서 눈여겨 보아야 할 부분은 마지막 줄에 해당 되는 내용이다.

앞에서도 몇차례 설명하였지만 FAT32 파일 시스템에서 Data 영역의 시작 위치는 클러스터 2번에 해당된다.  따라서 클러스터 번호에 해당되는 데이터 영역의 시작 위치를 찾으려면 항상 -2를 해주어야 한다.  이를 좀더 쉽게 계산하려면 data 영역의 시작을 클러스터 0에 해당되는 가상의 위치로 옮겨 주는 것이다.

그러면 굳이 -2를 이용한 계산을 하지 않아도 되기 때문이다.

위의 코드는 찾고자 하는 디렉토리를 문자열로 받아서 최종 디렉토리 정보가 포함되어 있는 클러스터 위치를 dir_info 구조체에 저장하는 코드이다.

디렉토리 문자열은 "/"로 구분되어 진다.  원하는 디렉토리를 찾으면 0을 리턴하고 찾지 못했을 경우에는 -1을 리턴하게 된다.

fat32_opendir()은 항상 root directory에서부터 찾아 나가도록 되어 있으며 상대적인 디렉토리 기능은 제공하지 않는다.

fat32_readdir()은 fat32_opendir()에서 찾은 디렉토리 클러스터에서 차례차례로 하나씩 DIR_entry 구조체를 읽어 오는 코드이다.

DIR_entry의 속성이 디렉토리이거나 파일이면 32번 줄에 보이는 것처럼 찾은 엔트리를 fat32_readdir()의 인자로 들어온 포인터가 가리키는 곳에 복사해준다.

일단, 엔트리를 찾으면 dir_info 구조체에 있는 entry_index값을 다음 엔트리를 가리키도록 하나 증가 시키고, 만약 이 값이 섹터 범위를 넘어가게 되면 다음 섹터에서 새로운 데이터를 받아 올 수 있도록 한다.  만약 섹터 범위가 클러스터 크기보다 크게 되면 get_next_clst() 함수를 이용하여 FAT entry에서 다음 DIR_entry가 연결되는 클러스터 인덱스를 읽어 와서 업데이트 하게 된다.

fat32_opendir()과 fat32_readdir()을 이용하여 원하는 디렉토리 내용을 조회하는 코드를 만들어 보도록 하겠다.

7번 줄에서 조회하고자 하는 디렉토리를 open하기 위하여 fat32_opendir()을 호출하는것을 볼 수 있다.  이때 사용자가 특별히 디렉토리를 지정해 주지 않으면 root directory를 검색하는걸로 간주해서 NULL 값을 넣어주도록 하고 있다.

정상적으로 디렉토리를 지정해 준것을 확인하였으면 fat32_readdir()을 이용하여 차례로 directory entry를 읽어 온다.

위의 코드를 이용하여 실제로 SD 메모리 카드에 저장되어 있는 파일들의 정보를 잘 읽어 오는지 확인해 본다.

처음에는 "ls"만 입력하여 root directory에 있는 디렉토리와 파일들을 검색하여 제대로 읽은 것을 확인한 다음, adc라는 이름의 하위 디렉토리를 지정하여 그 안에 들어 있는 파일들을 읽어 보았다.

에러 없이 정상적으로 디렉토리 내의 정보를 잘 읽어 오는것을 볼 수 있다.


fat32.zip


'프로젝트 > FAT32' 카테고리의 다른 글

FAT32 - 응용(MP3 player)  (0) 2017.09.26
FAT32 - fat32_openfile(), fat32_readfile()  (0) 2017.09.25
FAT32 -FAT Entry  (0) 2017.09.18
FAT32 - Directory Entry  (0) 2017.09.14
FAT32 - BPB(BIOS Parameter Block)  (0) 2017.09.12
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함