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;
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 작성
- 완전소스
// 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, 1, sizeof(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;
}
// 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, 1, sizeof(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