C语言基于窗体命令行打包,解包和浏览程序
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<io.h>
#include<iostream>
#include<string>
int count=0;
char path[50];
struct Note *next;
}Note,*Lnote;
char name[20];
unsigned int size;
}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型,并放在打包文件头
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;
}
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);
}
}
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语言基于窗体命令行打包,解包和浏览程序的更多相关文章
- 7个基于Linux命令行的文件下载和网站浏览工具
7个基于Linux命令行的文件下载和网站浏览工具 时间:2015-06-01 09:36来源:linux.cn 编辑:linux.cn 点击: 2282 次 Linux命令行是GNU/Linux中最神 ...
- 使用命令行打包 nuget 包
对于那些不打算涉及这么复杂而又想制作自己的 nuget 包的园友们,我是推荐使用 Nuget Package Explorer 来制作的.关于这个图形化的 nuget 包管理软件的使用,博客园内有相关 ...
- 5个基于Linux命令行的文件下载和网站浏览工具
导读 命令行是GNU/Linux中最神奇迷人的部分,它是非常强大的工具;命令行本身功能多样,多种内建或者第三方的命令行应用使得Linux变得更加健壮和强大.Linux Shell支持多种不同类型的网络 ...
- 命令行打包war包
输入jar -cvf 包名.war 目录/*
- 基于RTP的H264视频数据打包解包类
from:http://blog.csdn.net/dengzikun/article/details/5807694 最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打 ...
- [Android] 基于 Linux 命令行构建 Android 应用(七):自动化构建
本章将演示如何基于 Linux 命令行构建 Android 应用,在开始本章之前,希望你已经阅读之前几章内容. 本文环境为 RHEL Sandiego 32-bits,要基于 Linux CLI 构建 ...
- [转载]OpenSSL中文手册之命令行详解(未完待续)
声明:OpenSSL之命令行详解是根据卢队长发布在https://blog.csdn.net/as3luyuan123/article/details/16105475的系列文章整理修改而成,我自己 ...
- 7Z命令行详解
7z.exe在CMD窗口的使用说明如下: 7-Zip (A) 4.57 Copyright (c) 1999-2007 Igor Pavlov 2007-12-06 Usage: 7za <co ...
- mac下使用命令行打包出现bash gradle command not found的解决方案
命令行打包的时候出现 bash gradle command not found这个问题,主要是因为gradle环境丢失.需要重新配置gradle的环境变量. 1. gradle路径的查找 然后gra ...
随机推荐
- 为什么Hashtable ConcurrentHashmap不支持key或者value为null
ConcurrentHashmap HashMap和Hashtable都是key-value存储结构,但他们有一个不同点是 ConcurrentHashmap.Hashtable不支持key或者val ...
- Spring Boot 配置文件和命令行配置
Spring Boot 属于约定大于配置,就是说 Spring Boot 推荐不做配置,很多都是默认配置,但如果想要配置系统,使得软件符合业务定义,Spring Boot 可以通过多种方式进行配置. ...
- 原生JavaScript时间倒计时的方法
这个思路是来源用%的方法来做的: 以前用%做过转秒的 现在用来做倒计时方法: 需要用到的方法是getTime:获取距离1970年1月1日午夜00:00之间的毫秒差: var targetTime=ne ...
- Spring Boot2 系列教程(六)自定义 Spring Boot 中的 starter
我们使用 Spring Boot,基本上都是沉醉在它 Stater 的方便之中.Starter 为我们带来了众多的自动化配置,有了这些自动化配置,我们可以不费吹灰之力就能搭建一个生产级开发环境,有的小 ...
- FBCTF平台安装
一言难尽 = =开始不知道FBCTF只能安装在Ubuntu,在本地搭建半天好不容易弄起了PHP环境,打开错误,后来才知道只能在Ubuntu 14.04 LTS下安装= = FBCTF是Facebook ...
- 实战限流(guava的RateLimiter)
关于限流 常用的限流算法有漏桶算法和令牌桶算法,guava的RateLimiter使用的是令牌桶算法,也就是以固定的频率向桶中放入令牌,例如一秒钟10枚令牌,实际业务在每次响应请求之前都从桶中获取令牌 ...
- Spring入门(十四):Spring MVC控制器的2种测试方法
作为一名研发人员,不管你愿不愿意对自己的代码进行测试,都得承认测试对于研发质量保证的重要性,这也就是为什么每个公司的技术部都需要质量控制部的原因,因为越早的发现代码的bug,成本越低,比如说,Dev环 ...
- MybatisPlus报错Invalid bound statement (not found)的解决方案
今天使用MybatisPlus,测试时报错Invalid bound statement (not found) 使用自定义的mapper接口中的方法可以执行,而调用MybatisPlus中baseM ...
- Tomcat 报错 The APR based Apache Tomcat Native library which allows optimal performance in production environmen
这个问题在我一次重新装了tomcat和myeclipse时出现 说实话 出现这个问题头大 但是好在解决了 美滋滋 最开始到处寻找各种解决方案 最后直接注释了server.xml中的一行 直接解决这个报 ...
- SpringBootSecurity学习(02)网页版登陆配置类代替默认配置
增加Security配置类 前面演示了一个简单的登录入门例子,使用springboot-security默认的配置实现,虽然非常简单,但是基本实现了登录功能.不过在生产环境下,显然不能仅仅使用如此简单 ...