要求:將多個檔案打包到同一檔案,然後進行解包,解包時如果檔名重複進行標號。
ps:這裡只有打包功能,沒有對大小進行壓縮。
先考慮兩個問題:
(1)解包時如何將不同檔案分開?
我們可以在寫入檔案內容前,提前寫入乙個結構體,這個結構體存有檔案的大小和檔名,這樣在解包時,我們總是先讀出乙個結構體,得到下乙個檔案的大小和檔名,然後按照大小讀出內容即可。
(2)如何判斷檔名是否重複?
因為是c語言,沒有map對映,所以手搓了乙個雜湊函式進行標記(但模數不是很大,打包檔案較多容易衝突)。
一些細節的完善請自行實現。
打包程式如下:
1 #include 2 #include3 #include 4 #include 5
#define user_name_len 100
6#define email_len 100
7#define time_buf_len 100
8#define file_name_len 300
9#define buf_len 20
10#define dword unsigned long
11 typedef struct
filestruct
12 filestruct;
16char
name[file_name_len];
17char
buf[buf_len];
18int getfilesize(char *filename)
1926 fseek(fp,0l
,seek_end);
27int s=ftell(fp);
28fclose(fp);
29return
s;30}31
int main(void)32
41int kase=0
;42 file*sfile;
43while(1)44
53filestruct f;
54 f.filesize=getfilesize(name);
55if(f.filesize==-1)return0;
56 strcpy(f.filename,strrchr(name,'
\\')+1
);57
if(fwrite(&f,sizeof(filestruct),1,dfile)!=1)printf("
file write error!\n");
58int len=0;59
while((len=fread(buf,1,buf_len,sfile))>=buf_len)
6063 fwrite(buf,1
,len,dfile);64}
65 printf("
打包結束!\n");
66fclose(dfile);
67fclose(sfile);
68getchar();
69getchar();
70return0;
71 }
解包程式如下:
1 #include 2 #include3 #include 4 #include 5
#define user_name_len 100
6#define email_len 100
7#define time_buf_len 100
8#define file_name_len 300
9#define buf_len 20
10#define dword unsigned long
11#define ull unsigned long long
12 typedef struct
filestruct
13 filestruct;
17filestruct f;
18char
name[file_name_len];
19char
buf[buf_len],ans[buf_len];
20char
dic[file_name_len];
21int cnt[19260817
];22 ull base=131,mod=19260817
;23 ull hashs(char*s)
2430
char* div(char*dname)
3141
return
ans;42}
43int main(void)44
58while(fread(&f,sizeof(filestruct),1,sfile)==1)59
70 strcat(temp,strrchr(f.filename,'.'
));71
if((dfile=fopen(temp,"
wb"))==null)
7278
int left=f.filesize;
79while
(left)
8086
}87 printf("
解包結束!\n");
88fclose(sfile);
89fclose(dfile);
90getchar();
91getchar();
92return0;
93 }
C語言打包解包程式2
ifndef pach h define pach h define max path 128 define max name 32 typedef struct file file typedef struct folder info folder extern void pack extern ...
Linux下檔案打包與解包
打包 tar tar cvf pro.tar home lin pro 將 home lin pro資料夾下的所有檔案打包成pro.tar 打解包 tar.gz tar cvzf firefox 3.0.3.tar.gz firefox 將firefox資料夾打包為firefox 3.0.3.tar...
linux 打包與解包
r 遞迴壓縮子目錄 q 不列印回顯資訊 o 輸出檔名 x 過濾指定檔案 e 通過指定秘鑰加密 1 9 壓縮等級 越高,效率越低,壓縮率越高 zip r q 5 o abc.zip x zip l 檢視壓縮包內檔案 不解壓 d 指定輸出目錄 f 更新現有檔案 unzip d f abc.zip c 建...