zip 파일목록 보여주기 프로그램 작성 첫번째


  • zip local file header 구조체 작성

typedef unsigned short  ushort;
typedef unsigned long   ulong;


// Zip Local file header static
struct _zip_localfile_h
{
    ushort  ver;        // Version needed to extract (minimum)
    ushort  flag;       // General purpose bit flag
    ushort  method;     // Compression method
    ushort  time;       // File last modification time
    ushort  date;       // File last modification date
    ulong   crc;        // CRC-32
    ulong   compressed_size;    // Compressed size
    ulong   uncompressed_size;  // Uncompressed size
    ushort  filename_len;       // File name length (n)
    ushort  extra_len;          // Extra field length (m)
} __attribute__((packed));
typedef struct _zip_localfile_h zip_localfile_h;


  • main 작성

// "test.zip" 파일을 연다.
// 파일끝까지 반복한다.
   // 4바이트 시그너처를 읽어들인다.
   // zip local file header 시그너처가 아니면(0x04034b50)
      // break;
   // zip_localfile_h struct를 파일에서 읽어들인다.
   // 파일이름을 읽어들인다.
   // extra field를 읽어들인다.
   // 압축 데이터를 읽어들인다.
   // 파일 이름과 파일 크기등을 화면에 뿌린다.
// 파일을 닫는다.

  • 완전소스

// zipinfo.c
// http:://fehead.tistory.com
#include <stdio.h>
#include <stdlib.h>

typedef unsigned short  ushort;
typedef unsigned long   ulong;

// Zip Local file header static
struct _zip_localfile_h
{
    ushort  ver;        // Version needed to extract (minimum)
    ushort  flag;       // General purpose bit flag
    ushort  method;     // Compression method
    ushort  time;       // File last modification time
    ushort  date;       // File last modification date
    ulong   crc;        // CRC-32
    ulong   compressed_size;    // Compressed size
    ulong   uncompressed_size;  // Uncompressed size
    ushort  filename_len;       // File name length (n)
    ushort  extra_len;          // Extra field length (m)
} __attribute__((packed));int argc, char * argv[]
typedef struct _zip_localfile_h zip_localfile_h;

// main
int main()
{

    // "test.zip" 파일을 연다.
    FILE *  zip_file = 0;
    zip_file = fopen("test.zip""r");
    if(zip_file == 0)
    {
        perror("fopen:");
        return 0;
    }

    // 파일끝까지 반복한다.
    while(feof(zip_file) == 0)
    {

        // 4바이트 시그너처를 읽어들인다.
        ulong   signature;
        if(sizeof(signature) !=
                fread(&signature, 1sizeof(signature), zip_file))
        {
            fprintf(stderr,"zip file error\n");
            break;
        }

        // zip local file header 시그너처가 아니면(0x04034b50) break;
        if(signature != 0x04034b50)
        {
            printf("signature : %#x\n", signature);
            break;
        }

        // zip_localfile_h struct를 파일에서 읽어들인다.
        zip_localfile_h l;
        fread(&l, sizeof(l), 1, zip_file);

        char * filename = (char *)malloc(l.filename_len + 1);
        char * extra = (char *)malloc(l.extra_len);
        char * data = (char *)malloc(l.compressed_size);

        // 파일이름을 읽어들인다.
        fread(filename, 1, l.filename_len, zip_file);
        filename[l.filename_len] = '\0';

        // extra field를 읽어들인다.
        fread(extra, 1, l.extra_len, zip_file);

        // 압축 데이터를 읽어들인다.
        fread(data, 1, l.compressed_size, zip_file);

        // 파일 이름과 파일 크기등을 화면에 뿌린다.
        printf("%s\tCompressed size:%u\t Uncompressed size:%u\n",
                filename, l.compressed_size, l.uncompressed_size);

       
free(data);
        free(extra);
        free(filename);
    }

    // 파일을 닫는다.
    fclose(zip_file);
    return 0;
}

  • 결과
$ ./zipinfo 
aa.txt	Compressed size:16	 Uncompressed size:16
bb.txt	Compressed size:16	 Uncompressed size:16
signature : 0x2014b50

+ Recent posts