書式#include <stdio.hに>
する#include <stdlib.h>に含ま
書式#include <string.hの>
の#include <windows.hに>
する#include <io.h>
の#include <iostreamの>
の#include <文字列>
名前空間stdを使用。
int型のカウント= 0;
typedefは構造体注{
チャー経路[50]。
次のstruct注*;
}注* Lnote。
チャー経路[50]。
次のstruct注*;
}注* Lnote。
typedefは構造体ノード{
文字名[20]。
unsigned int型のサイズ。
文字名[20]。
unsigned int型のサイズ。
次のstructノード*;
}ノード、*リスト。
リストレコード生成(無効)。
無効アドオン(一覧*ヘッド、CHAR * TNAME、INT TSIZE)。
空BWRITE(のchar *は、fn);
空file_in(CHAR * Path_r、CHAR * Path_w)。
空のunzip(CHAR * Path_file、CHAR * Path_out)。
空lookthepack(のchar *パス);
Lnote Tcreat(無効)。
Taddでは(Lnote * thead要素、char型の*パス)を無効に。
空のzip(のchar *のAR1、CHAR * AR2)。
空lookthepack(のchar *パス){
私は、jはint型。
ノードp;
FILEの* fpは、
((FP =のfopen(パス、 "RB"))== NULL){場合
のprintf( "%sの\ nを開くことができません"、パス);
出口(1)。
}
のfseek(FP、0L、SEEK_SET)。
巻き戻し(FP)。
関数fread(&J、はsizeof(J)、1、FP)。
printf( "打包文件总数为:%Dを\ n"、J)。
用(i = 0; iが<jの、iは++){
関数fread(&P、はsizeof(P)、1、FP)。
printf( "%sのを\ n"、p.name)。
}
}
ボイドZIP(チャー*のAR1、AR2のchar *){
チャーチェック。
int型のL;
一覧ヘッド=レコード生成();
Lnote THEAD = Tcreat()。
長いハンドル;
FileInfo _finddata_t構造体。
リットル=のSTRLEN(AR1)。
用(; L> 0; 1 - ){
(AR1 [L-1] == '\\')場合{
[L] = AR1をチェックします。
破る;} }
(
チェック= '*'!)場合
strcatは(AR1、 "\\ * *。");
((ハンドル= _findfirst(AR1、&場合
printf( "パスは、N- \存在しません!");
終了(0);
}
他{
ん{
(!。 ""(のstrcmp(FileInfo.name、 "..")&&のstrcmp(FileInfo.name、))){IF
続行;
}
チャーpath_aを[40];
/ *取得し、次のファイルパスを削除することを意図している* /ワイルドカード後
のint str_leng、T;
strcpyの(path_a、AR1);
str_leng = STRLEN(path_a)
用(T + = str_leng 1。 ; T--)
{IF(path_a [-T 1] == '\\'){
path_a [T] = '\ 0';
BREAK;}
他の
path_a [T] = '0';
}
チャーTNAME [20であります];
strcpyの(TNAME、FileInfo.name);
STRCAT(path_a、TNAME); //絶対パスを取得します
}ノード、*リスト。
リストレコード生成(無効)。
無効アドオン(一覧*ヘッド、CHAR * TNAME、INT TSIZE)。
空BWRITE(のchar *は、fn);
空file_in(CHAR * Path_r、CHAR * Path_w)。
空のunzip(CHAR * Path_file、CHAR * Path_out)。
空lookthepack(のchar *パス);
Lnote Tcreat(無効)。
Taddでは(Lnote * thead要素、char型の*パス)を無効に。
空のzip(のchar *のAR1、CHAR * AR2)。
空lookthepack(のchar *パス){
私は、jはint型。
ノードp;
FILEの* fpは、
((FP =のfopen(パス、 "RB"))== NULL){場合
のprintf( "%sの\ nを開くことができません"、パス);
出口(1)。
}
のfseek(FP、0L、SEEK_SET)。
巻き戻し(FP)。
関数fread(&J、はsizeof(J)、1、FP)。
printf( "打包文件总数为:%Dを\ n"、J)。
用(i = 0; iが<jの、iは++){
関数fread(&P、はsizeof(P)、1、FP)。
printf( "%sのを\ n"、p.name)。
}
}
ボイドZIP(チャー*のAR1、AR2のchar *){
チャーチェック。
int型のL;
一覧ヘッド=レコード生成();
Lnote THEAD = Tcreat()。
長いハンドル;
FileInfo _finddata_t構造体。
リットル=のSTRLEN(AR1)。
用(; L> 0; 1 - ){
(AR1 [L-1] == '\\')場合{
[L] = AR1をチェックします。
破る;} }
(
チェック= '*'!)場合
strcatは(AR1、 "\\ * *。");
((ハンドル= _findfirst(AR1、&場合
printf( "パスは、N- \存在しません!");
終了(0);
}
他{
ん{
(!。 ""(のstrcmp(FileInfo.name、 "..")&&のstrcmp(FileInfo.name、))){IF
続行;
}
チャーpath_aを[40];
/ *取得し、次のファイルパスを削除することを意図している* /ワイルドカード後
のint str_leng、T;
strcpyの(path_a、AR1);
str_leng = STRLEN(path_a)
用(T + = str_leng 1。 ; T--)
{IF(path_a [-T 1] == '\\'){
path_a [T] = '\ 0';
BREAK;}
他の
path_a [T] = '0';
}
チャーTNAME [20であります];
strcpyの(TNAME、FileInfo.name);
STRCAT(path_a、TNAME); //絶対パスを取得します
TADD(&THEAD、path_a)。
追加(&ヘッド、FileInfo.name、FileInfo.size)。
++数えます。
}(_findnext(のFileInfoと、ハンドル)== 0)、一方、
_findclose(ハンドル)。
FILEの*のfp_stu、* fp_txt;
IF((fp_stu =のfopen( "AB&+"、のAR2))== NULL){
printf関数は( "++++%S \ N-開くことができない"、のAR2);
出口(1);
}
他{
巻き戻し(fp_stu);
fwriteの(&COUNT、はsizeof(COUNT),. 1、fp_stu); // intへ、パッケージのヘッダーを文書の総数を記録します
ノード*上。
OP =頭部>次。
(!OP = NULL){一方
fwriteの(OP、はsizeof(* OP)、1、fp_stu)。
OP = OP->次。
}
FCLOSE(fp_stu)。
}
注:*のPT。
PT = Thead->次。
一方、(!PT = NULL){
file_in(PT->パス、AR2)。//文件读取及写入
PT = PT->次。
}
}
}
(!OP = NULL){一方
fwriteの(OP、はsizeof(* OP)、1、fp_stu)。
OP = OP->次。
}
FCLOSE(fp_stu)。
}
注:*のPT。
PT = Thead->次。
一方、(!PT = NULL){
file_in(PT->パス、AR2)。//文件读取及写入
PT = PT->次。
}
}
}
ボイド解凍(CHAR * Path_file、CHAR * Path_out){
FILEの*のFP1、FP2 *、* FP3。
文字chを、
INT NUM、M = 0;
ノードp;
((FP1 =のfopen(Path_file、 "RB"))== NULL){場合
のprintf( "%sの\ nを開くことができません"、Path_file)。
出口(1)。
}
他((FP2 =のfopen(Path_file、 "RB"))== NULL){場合
のprintf( "%sの\ nを開くことができません"、Path_file)。
出口(1)。
}
他{
fseek関数(fp1,0L、SEEK_SET)。
fseek関数(fp2,0L、SEEK_SET)。
巻き戻し(FP1)。
巻き戻し(FP1)。
関数fread(&NUM、はsizeof(NUM)、1、FP1)。
printf( "ファイル数は次のとおりです。%dは\ nを"、NUM);
fseek関数(FP2、はsizeof(int型)、SEEK_SET);
fseek関数(FP2、はsizeof(P)* NUM、SEEK_CUR);
{M ++を行います。
関数fread(&P、はsizeof(P)、1、FP1)。
[40] fullpath_outチャー。
文字名[20]。
int型私= 0;
strcpyの(名前、p.name)。
strcpyの(fullpath_out、Path_out)。
strcatは(fullpath_out、名);
((FP3 =のfopen(fullpath_out、 "AB +"))== NULL){場合
のprintf( "%sの\ nを開くことができません"、fullpath_out)。
出口(1)。
}
他{
用(i = 0; iは<p.size; I + =(はsizeof(CHAR))){
関数fread(&CH、はsizeof(CH)、1、FP2)。
fwriteの(&CH、はsizeof(CH)、1、FP3)。
}
}
}ながら(M <NUM)。
FCLOSE(FP1)。
FCLOSE(FP2)。
FCLOSE(FP3)。
}
ボイドfile_in(CHAR * Path_r、CHAR * Path_w){
FILEの*のFPR、* FPW。
文字chを、
((FPRの=用のfopen(Path_r、 "RB"))== NULL){場合
のprintf( "文件路径%S \ nは開くことができません"、Path_r)。
出口(1)。
}
((FPW =のfopen(Path_w、 "AB +"))== NULL){場合
のprintf( "N打包指向路径%S \開くことができません"、Path_w)。
出口(1)。
}
のfseek(FPW、0L、SEEK_END)。
しばらく(!(CH =はfgetc(FPR))= EOF)
FPUTC(CH、FPW)。
FCLOSE(FPR)。
FCLOSE(FPW)。
}
Lnote Tcreat(ボイド){
Lnote THEAD =(Lnote)はmalloc(はsizeof(注))。
Thead->次= NULL;
thead要素を返します。
}
Taddでは(Lnote * THEAD、CHAR *パス){無効
注* S * Rと、
R = * THEAD。
(!R->次= NULL){ながら
次のR = R->。
}
、S =(Lnote)はmalloc(はsizeof(注))。
strcpyの(S->パス、パス)。
R->次= S;
S->次= NULL;
}
リストレコード生成(ボイド){
リストヘッド=(一覧)はmalloc(はsizeof(ノード))。
頭部>次= NULL;
頭を返します。
}
ボイド追加(リスト*ヘッド、CHAR * TNAME、TSIZEをINT){
I = 0 int型。
ノード* sで、R *;
R = *ヘッド。
(!R->次= NULL){ながら
次のR = R->。
}
、S =(一覧)はmalloc(はsizeof(ノード))。
strcpyの(S->名、TNAME)。
S->サイズ= TSIZE。
R->次= S;
S->次= NULL;
}
メインINT(INTのARGC、CHAR * ARGV []){
IF(ARGC> = 1){
(のstrcmp(ARGVの、 "ヘルプ")== 0 [1]){IF
以下の通りのprintf(「このコマンドラインパラメータは:\ N- ");
のprintf(" %Dの\のN-合計コマンド」、ARGCの+ 1);
(I = 0をint型のために、私はARGC <; Iは++)
のprintf( "%S%D \ N-"、ARGV [I]、 I);
}
}
IF(ARGC> = 1){
(のstrcmp(ARGVの、 "ヘルプ")== 0 [1]){IF
以下の通りのprintf(「このコマンドラインパラメータは:\ N- ");
のprintf(" %Dの\のN-合計コマンド」、ARGCの+ 1);
(I = 0をint型のために、私はARGC <; Iは++)
のprintf( "%S%D \ N-"、ARGV [I]、 I);
}
}
場合/ * argvのに対応して[1]、 '-L'であるパケット* /の表示圧縮ファイル示し
チャーA [20である]、Bの[5];
(I = 0をint型、I 2を<; I ++の)のため{
B [I]のargv = [I]、[1]
}
B [2] = '\ 0';
IF([1]のstrcmp(ARGVの、 " - L")== 0){
lookthepack(ARGV [2]) ;
}
/ *以下ARGVに対応する[1]、 '-u'伸長* /表す
- {他IF( "U")== 0のstrcmp(B)
;のprintf( "sasda \ N-")
解凍( ; ARGV [2]のargv [3])
}
他{
[1] ZIP(のargv、ARGV [2]);
}
戻り0;
/ *コマンド以下の例* /
// E:\梱包ケース\ TEST.EXE E :\梱包ケース\ Thepack \ *。* E:\梱包ケース\
// E:\梱包ケース\ TEST.EXE -l E:\梱包ケース\ testqq.txt
// E:\梱包ケース\ TEST.EXE - U E:ケースを梱包\ testqq.txtのE:\ \ \ zxcv \ケース梱包
チャーA [20である]、Bの[5];
(I = 0をint型、I 2を<; I ++の)のため{
B [I]のargv = [I]、[1]
}
B [2] = '\ 0';
IF([1]のstrcmp(ARGVの、 " - L")== 0){
lookthepack(ARGV [2]) ;
}
/ *以下ARGVに対応する[1]、 '-u'伸長* /表す
- {他IF( "U")== 0のstrcmp(B)
;のprintf( "sasda \ N-")
解凍( ; ARGV [2]のargv [3])
}
他{
[1] ZIP(のargv、ARGV [2]);
}
戻り0;
/ *コマンド以下の例* /
// E:\梱包ケース\ TEST.EXE E :\梱包ケース\ Thepack \ *。* E:\梱包ケース\
// E:\梱包ケース\ TEST.EXE -l E:\梱包ケース\ testqq.txt
// E:\梱包ケース\ TEST.EXE - U E:ケースを梱包\ testqq.txtのE:\ \ \ zxcv \ケース梱包
}
私は、ファイルフォルダが適用されることを意味し、再帰的に行われ、フォルダいません。プログラムは、ほとんど空は,,圧縮後の補足します。