#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<io.h>
#include<iostream>
#include<string>
using namespace std;
 int count=0;
 typedef struct Note{
  char path[50];
  struct Note *next;
 }Note,*Lnote;
 typedef struct Node {
  char name[20];
  unsigned int size;
  struct Node *next;   
 }Node,*List;
 
 List creat(void);
 void add(List *head,char *Tname,int Tsize);
 void bwrite(char *fn);
 void file_in(char *Path_r,char *Path_w);
 void unzip(char *Path_file,char *Path_out);
 void lookthepack(char *path);
 Lnote Tcreat(void);
 void Tadd(Lnote *Thead,char *Path);
 void zip(char *ar1,char *ar2); 
 
 
 
 void lookthepack(char *path){
  int i,j;
  Node p;
  FILE *fp;
   if((fp=fopen(path,"rb"))==NULL){
   printf("Can't open %s\n",path);
    exit(1);
   }
   fseek(fp,0L,SEEK_SET); 
   rewind(fp);
   fread(&j,sizeof(j),1,fp);
   printf("打包文件总数为:  %d\n",j);
   for(i=0;i<j;i++){
    fread(&p,sizeof(p),1,fp);
    printf("%s\n",p.name);
   }
 }
 
 
 
 void zip(char *ar1,char *ar2){
   char check;
   int l;
   List head=creat();
   Lnote Thead=Tcreat();
     long Handle;
   struct _finddata_t FileInfo;
    l=strlen(ar1);
   for(;l>0;l--){
    if(ar1[l-1]=='\\'){
     check=ar1[l];
     break;}
   }
   if(check!='*')
    strcat(ar1,"\\*.*");  
     
  if((Handle=_findfirst(ar1,&FileInfo))==-1){
  /*  以下为路径不包括通配符情况*/
   printf("路径不存在!\n");
   exit(0);
 }
  
  else{
  do{
   if (!(strcmp(FileInfo.name, "..")&&strcmp(FileInfo.name,"."))){
    continue;
    }
  char path_a[40];
/* 以下旨在获取除去通配符后的文件路径 */
  int str_leng,t;
  strcpy(path_a,ar1);
  str_leng=strlen(path_a);
  for(t= str_leng+1;;t--)
   {if(path_a[t-1]=='\\'){
    path_a[t]='\0';
    break;}
   else
    path_a[t]='0';  
    
   }
   
  char Tname[20];
  strcpy(Tname,FileInfo.name);
   strcat(path_a,Tname);  //获取绝对路径
    
   Tadd(&Thead,path_a);
   add(&head,FileInfo.name,FileInfo.size);     
    count++;  
   }while(_findnext(Handle,&FileInfo)==0); 
  _findclose(Handle);
  
  FILE *fp_stu,*fp_txt;
  if((fp_stu=fopen(ar2,"ab+"))==NULL){
   printf("Can't open++++ %s\n",ar2);
   exit(1);
  }
  else{
   rewind(fp_stu);
   fwrite(&count,sizeof(count),1,fp_stu);  //记录文件总个数为int型,并放在打包文件头
   Node *op;
   op=head->next;
   while(op!=NULL){
    fwrite(op,sizeof(*op),1,fp_stu); 
    op=op->next;
    }
    fclose(fp_stu); 
  } 
 
  
  Note *pt;
  pt=Thead->next;
  while(pt!=NULL){
   file_in(pt->path,ar2);     //文件读取及写入
   pt=pt->next;
  } 
 }
}  
 
 void unzip(char *Path_file,char *Path_out){
  FILE *fp1,*fp2,*fp3;
  char ch;
  int num,m=0;
  Node p;
  
  if((fp1=fopen(Path_file,"rb"))==NULL){
   printf("Can't open %s\n",Path_file);
    exit(1);
   }
  else if((fp2=fopen(Path_file,"rb"))==NULL){
   printf("Can't open %s\n",Path_file);
    exit(1);
   } 
  else{
  
  fseek(fp1,0L,SEEK_SET); 
  fseek(fp2,0L,SEEK_SET);  
  rewind(fp1);
  rewind(fp1);
  fread(&num,sizeof(num),1,fp1);
  printf("The file-count is   :    %d\n",num);
  fseek(fp2,sizeof(int),SEEK_SET);
  fseek(fp2,sizeof(p)*num,SEEK_CUR);
  do { m++;
  fread(&p,sizeof(p),1,fp1);
  char fullpath_out[40];
  char name[20];
  int i=0;
  strcpy(name,p.name);
  strcpy(fullpath_out,Path_out);
  strcat(fullpath_out,name);
  if((fp3=fopen(fullpath_out,"ab+"))==NULL){
   printf("Can't open    %s   \n",fullpath_out);
    exit(1);
   }
  else{
   
   for(i=0;i<p.size;i+=(sizeof(char))){
   fread(&ch,sizeof(ch),1,fp2);
   fwrite(&ch,sizeof(ch),1,fp3);
   }
   }
  }while(m<num);
   fclose(fp1);
   fclose(fp2);
   fclose(fp3);
 
 }
  
}
  
 void file_in(char *Path_r,char *Path_w){
  FILE *fpr,*fpw;
  char ch;
  if((fpr=fopen(Path_r,"rb"))==NULL){
   printf("Can't open  文件路径  %s\n",Path_r);
    exit(1);
   }
   
  if((fpw=fopen(Path_w,"ab+"))==NULL){
   printf("Can't open  打包指向路径 %s\n",Path_w);
   exit(1);
   }
   fseek(fpw,0L,SEEK_END);    
   while ((ch=fgetc(fpr))!=EOF)
    fputc(ch,fpw);
  
  
   fclose(fpr);
   fclose(fpw);  
 }
 
 Lnote Tcreat(void){
  Lnote Thead=(Lnote)malloc(sizeof(Note));
  Thead->next=NULL;
  return Thead;
 }
 void Tadd(Lnote *Thead,char *Path){
  Note *s,*r;
  r=*Thead;
  while(r->next!=NULL){
   r=r->next;  
  }
  s=(Lnote)malloc(sizeof(Note));
  strcpy(s->path,Path);
  r->next=s;
  s->next=NULL;
 }
 
 List creat(void){
  List head=(List)malloc(sizeof(Node));
  head->next=NULL;
  return head;
}
 void add(List *head,char *Tname,int Tsize){
  int i=0;
  Node *s,*r;
  r=*head;
 
  while(r->next!=NULL){
   r=r->next;  
  } 
  s=(List)malloc(sizeof(Node));
  strcpy(s->name,Tname);
  s->size=Tsize;
  r->next=s;
  s->next=NULL;
 }
 
 
 
int main(int argc,char *argv[]){
 
  
 if(argc>=1){
  if(strcmp(argv[1],"help")==0){
     printf("此程序命令行参数如下:  \n");
     printf("命令总数为 %d    \n",argc+1); 
  for(int i=0;i<argc;i++)
      printf("%s     %d\n",argv[i],i);
     }
 }
 /*  以下对应于argv[1]为‘-l’时,表示显示压缩包内的文件 */ 
  
   
    char a[20],b[5];
 for(int i=0;i<2;i++){
  b[i]=argv[1][i];
 }
  b[2]='\0';
 
    if(strcmp(argv[1],"-l")==0){
     lookthepack(argv[2]);  
     
 } 
 
 /*  以下对应于argv[1]为‘-u’时,表示解压 */ 
    else if(strcmp(b,"-u")==0){
     printf("sasda\n");
     unzip(argv[2],argv[3]);
    }
  
 else { 
   zip(argv[1],argv[2]);   
 }
  return 0;
  /*事例命令如下*/
//E:\打包事例\test.exe E:\打包事例\Thepack\*.* E:\打包事例\
//E:\打包事例\test.exe -l E:\打包事例\testqq.txt
//E:\打包事例\test.exe -u E:\打包事例\testqq.txt E:\打包事例\zxcv\
 
}
 
 
还没有做递归和文件夹,也就是说仅仅对文件夹内文件适用。这个程序还差一点压缩,,之后有空再补上。

C语言基于窗体命令行打包,解包和浏览程序的更多相关文章

  1. 7个基于Linux命令行的文件下载和网站浏览工具

    7个基于Linux命令行的文件下载和网站浏览工具 时间:2015-06-01 09:36来源:linux.cn 编辑:linux.cn 点击: 2282 次 Linux命令行是GNU/Linux中最神 ...

  2. 使用命令行打包 nuget 包

    对于那些不打算涉及这么复杂而又想制作自己的 nuget 包的园友们,我是推荐使用 Nuget Package Explorer 来制作的.关于这个图形化的 nuget 包管理软件的使用,博客园内有相关 ...

  3. 5个基于Linux命令行的文件下载和网站浏览工具

    导读 命令行是GNU/Linux中最神奇迷人的部分,它是非常强大的工具;命令行本身功能多样,多种内建或者第三方的命令行应用使得Linux变得更加健壮和强大.Linux Shell支持多种不同类型的网络 ...

  4. 命令行打包war包

    输入jar -cvf  包名.war  目录/*

  5. 基于RTP的H264视频数据打包解包类

    from:http://blog.csdn.net/dengzikun/article/details/5807694 最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打 ...

  6. [Android] 基于 Linux 命令行构建 Android 应用(七):自动化构建

    本章将演示如何基于 Linux 命令行构建 Android 应用,在开始本章之前,希望你已经阅读之前几章内容. 本文环境为 RHEL Sandiego 32-bits,要基于 Linux CLI 构建 ...

  7. [转载]OpenSSL中文手册之命令行详解(未完待续)

     声明:OpenSSL之命令行详解是根据卢队长发布在https://blog.csdn.net/as3luyuan123/article/details/16105475的系列文章整理修改而成,我自己 ...

  8. 7Z命令行详解

    7z.exe在CMD窗口的使用说明如下: 7-Zip (A) 4.57 Copyright (c) 1999-2007 Igor Pavlov 2007-12-06 Usage: 7za <co ...

  9. mac下使用命令行打包出现bash gradle command not found的解决方案

    命令行打包的时候出现 bash gradle command not found这个问题,主要是因为gradle环境丢失.需要重新配置gradle的环境变量. 1. gradle路径的查找 然后gra ...

随机推荐

  1. 为什么Hashtable ConcurrentHashmap不支持key或者value为null

    ConcurrentHashmap HashMap和Hashtable都是key-value存储结构,但他们有一个不同点是 ConcurrentHashmap.Hashtable不支持key或者val ...

  2. Spring Boot 配置文件和命令行配置

    Spring Boot 属于约定大于配置,就是说 Spring Boot 推荐不做配置,很多都是默认配置,但如果想要配置系统,使得软件符合业务定义,Spring Boot 可以通过多种方式进行配置. ...

  3. 原生JavaScript时间倒计时的方法

    这个思路是来源用%的方法来做的: 以前用%做过转秒的 现在用来做倒计时方法: 需要用到的方法是getTime:获取距离1970年1月1日午夜00:00之间的毫秒差: var targetTime=ne ...

  4. Spring Boot2 系列教程(六)自定义 Spring Boot 中的 starter

    我们使用 Spring Boot,基本上都是沉醉在它 Stater 的方便之中.Starter 为我们带来了众多的自动化配置,有了这些自动化配置,我们可以不费吹灰之力就能搭建一个生产级开发环境,有的小 ...

  5. FBCTF平台安装

    一言难尽 = =开始不知道FBCTF只能安装在Ubuntu,在本地搭建半天好不容易弄起了PHP环境,打开错误,后来才知道只能在Ubuntu 14.04 LTS下安装= = FBCTF是Facebook ...

  6. 实战限流(guava的RateLimiter)

    关于限流 常用的限流算法有漏桶算法和令牌桶算法,guava的RateLimiter使用的是令牌桶算法,也就是以固定的频率向桶中放入令牌,例如一秒钟10枚令牌,实际业务在每次响应请求之前都从桶中获取令牌 ...

  7. Spring入门(十四):Spring MVC控制器的2种测试方法

    作为一名研发人员,不管你愿不愿意对自己的代码进行测试,都得承认测试对于研发质量保证的重要性,这也就是为什么每个公司的技术部都需要质量控制部的原因,因为越早的发现代码的bug,成本越低,比如说,Dev环 ...

  8. MybatisPlus报错Invalid bound statement (not found)的解决方案

    今天使用MybatisPlus,测试时报错Invalid bound statement (not found) 使用自定义的mapper接口中的方法可以执行,而调用MybatisPlus中baseM ...

  9. Tomcat 报错 The APR based Apache Tomcat Native library which allows optimal performance in production environmen

    这个问题在我一次重新装了tomcat和myeclipse时出现 说实话 出现这个问题头大 但是好在解决了 美滋滋 最开始到处寻找各种解决方案 最后直接注释了server.xml中的一行 直接解决这个报 ...

  10. SpringBootSecurity学习(02)网页版登陆配置类代替默认配置

    增加Security配置类 前面演示了一个简单的登录入门例子,使用springboot-security默认的配置实现,虽然非常简单,但是基本实现了登录功能.不过在生产环境下,显然不能仅仅使用如此简单 ...