#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. 【LeetCode】17-电话号码的字母组合

    题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出: ...

  2. Java 多线程实现接口Runnable和继承Thread区别(转)

    Java 多线程实现接口Runnable和继承Thread区别 Java中有两种实现多线程的方式.一是直接继承Thread类,二是实现Runnable接口.那么这两种实现多线程的方式在应用上有什么区别 ...

  3. 上传文件的C#代码

    1 <%@ WebHandler Language="C#" Class="UpLoadFile" %> 2 3 using System; 4 u ...

  4. 纯css制作电闪雷鸣的天气图标

    效果 效果图如下 ​ 实现思路 使用box-shadow属性写几个圆,将这些圆错落的组合在一起,形成云朵图案 after伪元素写下面的投影样式 before伪元素写黄色闪电的样式 dom结构 用两个嵌 ...

  5. vue-property-decorator vue typescript写法

    什么是Typescript TypeScript 是一种由微软开发的自由和开源的编程语言,它是 JavaScript 的一个超集,扩展了 JavaScript 的语法.作者是安德斯大爷, Delphi ...

  6. android- 对话框中弹出edittext 不能调出输入法

    最近项目中用到 dialog弹出对话框功能, 弹出后输入 密码, 本以为这是一个很简单问题,但是做好发现Edittext 无法调出输入法. 解决方法,我也是百度找到的 . 记录一下,便于下次使用: f ...

  7. 在nginx日志access log可以记录POST请求的参数值

    1)      在nginx日志access log可以记录POST请求的参数值 实现程度:日志中可以显示POST请求所提交的参数值 问题: 日志中文显示十六进制(在配置文件中配置中文也无效) 没有对 ...

  8. hadoop生态系列

    1.hadoop高可用安装和原理详解 2.hadoop2.7+spark2.2+zookeeper3.4.简单安装 3.windows下通过idea连接hadoop和spark集群 4.hadoop2 ...

  9. Android手机QQ文件夹解析

    注:切勿修改手机QQ文件夹,以免造成不必要的使用问题及无法修复的数据丢失] 安卓手机QQ tencent文件夹解析 QQ下载的聊天背景:tencent→MobileQQ→system_backgrou ...

  10. 【PyTorch】Tricks 集锦

    声明:本文大部分内容是从知乎.博客等知识分享站点摘录而来,以方便查阅学习.具体摘录地址已在文章底部引用部分给出. 1. 查看模型每层输出详情 from torchsummary import summ ...