C言語のフォームベースのコマンドライン・梱包、開梱や梱包ブラウズファイル情報


書式#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。
 typedefは構造体ノード{
  文字名[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); //絶対パスを取得します
    
   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->次。
  } 
 }
}  
 
 ボイド解凍(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);
     }
 }
 場合/ * 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 \ケース梱包

 
}
 
 
私は、ファイルフォルダが適用されることを意味し、再帰的に行われ、フォルダいません。プログラムは、ほとんど空は,,圧縮後の補足します。

おすすめ

転載: www.cnblogs.com/luckydogboy/p/11700380.html