82.2 아카이브 파일 구조체 작성하기

아카이브 파일의 구조를 설계했으니 구조체를 작성해보겠습니다. 먼저 아카이브 헤더입니다. 다음과 같이 헤더에는 아카이브 파일의 매직 넘버와 파일 버전이 들어갑니다. 여기서는 각 멤버의 크기를 정확하게 표현할 수 있는 헤더 파일의 자료형을 사용하겠습니다.

// 아카이브 파일에 저장되는 구조체
typedef struct _ARCHIVE_HEADER {   // 아카이브 헤더 구조체 정의
    uint16_t magic;                    // 아카이브 파일 매직 넘버
    uint16_t version;                  // 아카이브 파일 버전
} ARCHIVE_HEADER, *PARCHIVE_HEADER;

이번에는 파일 정보(file descriptor) 구조체입니다. 파일 이름 문자열과 파일 크기, 파일 데이터의 위치가 들어갑니다. 여기서 파일 데이터의 위치는 아카이브 파일 안에서 해당 파일의 데이터가 있는 곳의 시작 위치를 저장하게 됩니다.

// 아카이브 파일에 저장되는 구조체
typedef struct _FILE_DESC {    // 파일 정보 구조체 정의
    char     name[256];            // 파일 이름
    uint32_t size;                 // 파일 크기
    uint32_t dataOffset;           // 파일 데이터의 위치
} FILE_DESC, *PFILE_DESC;

ARCHIVE_HEADER, FILE_DESC 구조체는 자료형 크기 그대로 저장되어야 하므로 #pragma pack(push, 1), #pragma pack(pop)을 사용하여 1바이트 크기로 정렬해줍니다.

참고 | 아카이브 파일 구조의 한계

지금까지 설계한 아카이브 파일의 구조는 다음과 같은 한계가 있습니다.

  • 파일 이름은 255자 이상 저장할 수 없습니다.
  • 파일 크기와 파일 데이터의 위치를 저장하는 자료형이 uint32_t이므로 크기가 4GiB 이상인 파일은 저장할 수 없습니다.
  • 아카이브 파일의 최대 크기는 운영체제의 파일시스템에서 저장할 수 있는 파일 하나의 크기를 따릅니다.