精华内容
下载资源
问答
  • 哈夫曼实现文件压缩解压缩(c语言)

    万次阅读 多人点赞 2019-01-23 17:04:47
    写一个对文件进行压缩和解压缩的程序,功能如下: ① 可以对纯英文文档实现压缩和解压; ② 较好的界面程序运行的说明。 介绍哈夫曼: 效率最高的判别树即为哈夫曼树 在计算机数据处理中,霍夫曼编码...

    写一个对文件进行压缩和解压缩的程序,功能如下:

    ① 可以对纯英文文档实现压缩和解压;

    ② 较好的界面程序运行的说明。

     

     

    介绍哈夫曼:

     

    效率最高的判别树即为哈夫曼树

    在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。

    例如,在英文中,e的出现机率最高,而z的出现概率则最低。当利用霍夫曼编码对一篇英文进行压缩时,e极有可能用一个比特来表示,而z则可能花去25个比特(不是26)。用普通的表示方法时,每个英文字母均占用一个字节,即8个比特。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。

    霍夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的路径长度是从树根到每一结点的路径长度之和,记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。可以证明霍夫曼树的WPL是最小的。

     

    文件压缩与解压

    姓名:  范天祚 

    1 程序说明

    1.1数据结构

    哈夫曼树

    1.2函数功能说明

    printfPercent界面

    compress()读取文件内容并加以压缩,将压缩内容写入另一个文档

    uncompress()解压缩文件,并将解压后的内容写入新文件

    1.3 程序编写的思路及流程

    压缩:统计字符出现次数、将节点按出现次数排序、构造哈夫曼树、设置字符编码、读文件字符、按设置好的编码替换字符、写入存储文件

    解压:读取文件各参数、转换成二进制码、按码求对应字符、写入存储文件

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    struct head
    {
        int b;						  //字符
        long count;                   //文件中该字符出现的次数
        long parent, lch, rch;        //make a tree
        char bits[256];               //the huffuman code
    };
    
    struct head header[512], tmp;  //节点树
    
    void printfPercent(int per)
    {
    	int i = 0;
    	printf("|");
    	for(i = 0; i < 10; i++)
    	{
    		if(i < per/10)
    			printf(">");
    		else
    			printf("-");
    	}
    	printf("|已完成%d%%\n",per);
    }
    
    //函数:compress()
    //作用:读取文件内容并加以压缩
    //将压缩内容写入另一个文档
    int compress(const char *filename,const char *outputfile)
    {
        char buf[512];
        unsigned char c;
        long i, j, m, n, f;
        long min1, pt1, flength;
        FILE *ifp, *ofp;
    	int per = 10;
        ifp = fopen(filename, "rb");                  //打开原始文件
        if (ifp == NULL)
        {
            printf("打开文件失败:%s\n",filename);
            return 0;                             //如果打开失败,则输出错误信息
        }
        ofp = fopen(outputfile,"wb");                 //打开压缩后存储信息的文件
        if (ofp == NULL)
        {
            printf("打开文件失败:%s\n",outputfile);
            return 0;
        }
        flength = 0;
        while (!feof(ifp))
        {
            fread(&c, 1, 1, ifp);
            header[c].count ++;                       //读文件,统计字符出现次数
            flength ++;                               //记录文件的字符总数
        }
        flength --;
        header[c].count --;
        for (i = 0; i < 512; i ++)                    //HUFFMAN算法中初始节点的设置
        {
            if (header[i].count != 0)
                header[i].b = (unsigned char) i;
            else
                header[i].b = -1;
            header[i].parent = -1;
            header[i].lch = header[i].rch = -1;
        }
    
        for (i = 0; i < 256; i ++)                    //将节点按出现次数排序
        {
            for (j = i + 1; j < 256; j ++)
            {
                if (header[i].count < header[j].count)
                {
                    tmp = header[i];
                    header[i] = header[j];
                    header[j] = tmp;
                }
            }
        }
    
    
        for (i = 0; i < 256; i ++)                    //统计不同字符的数量
    	{
            if (header[i].count == 0)
                break;
    	}
    
        n = i;
        m = 2 * n - 1;
        for (i = n; i < m; i ++)
        {
            min1 = 999999999;
            for (j = 0; j < i; j ++)
            {
                if (header[j].parent != -1) continue;
                if (min1 > header[j].count)
                {
                    pt1 = j;
                    min1 = header[j].count;
                    continue;
                }
            }
            header[i].count = header[pt1].count;
            header[pt1].parent = i;
            header[i].lch = pt1;
            min1 = 999999999;
            for (j = 0; j < i; j ++)
            {
                if (header[j].parent != -1) continue;
                if (min1 > header[j].count)
                {
                    pt1 = j;
                    min1 = header[j].count;
                    continue;
                }
            }
            header[i].count += header[pt1].count;
            header[i].rch = pt1;
            header[pt1].parent = i;
        }
    
        for (i = 0; i < n; i ++)                        //构造HUFFMAN树,设置字符的编码
        {
            f = i;
            header[i].bits[0] = 0;
            while (header[f].parent != -1)
            {
                j = f;
                f = header[f].parent;
                if (header[f].lch == j)
                {
                    j = strlen(header[i].bits);
                    memmove(header[i].bits + 1, header[i].bits, j + 1);
                    header[i].bits[0] = '0';
                }
                else
                {
                    j = strlen(header[i].bits);
                    memmove(header[i].bits + 1, header[i].bits, j + 1);
                    header[i].bits[0] = '1';
                }
            }
        }
    
        //下面的就是读原文件的每一个字符,按照设置好的编码替换文件中的字符
        fseek(ifp, 0, SEEK_SET);                                                //将指针定在文件起始位置
        fseek(ofp, 8, SEEK_SET);                                //以8位二进制数为单位进行读取
        buf[0] = 0;
        f = 0;
        pt1 = 8;
    
    	printf("读取将要压缩的文件:%s\n",filename);
    	printf("当前文件有:%d字符\n",flength);
    	printf("正在压缩\n");
    
        while (!feof(ifp))
        {
            c = fgetc(ifp);
            f ++;
            for (i = 0; i < n; i ++)
            {
                if (c == header[i].b) break;
            }
            strcat(buf, header[i].bits);
            j = strlen(buf);
            c = 0;
            while (j >= 8)                                             //当剩余字符数量不小于8个时
            {
                for (i = 0; i < 8; i ++)                               //按照八位二进制数转化成十进制ASCII码写入文件一次进行压缩
                {
                    if (buf[i] == '1') c = (c << 1) | 1;
                    else c = c << 1;
                }
                fwrite(&c, 1, 1, ofp);
                pt1 ++;
                strcpy(buf, buf + 8);
                j = strlen(buf);
            }
    		if(100 * f/flength > per)
    		{
    			printfPercent(per);
    			per += 10;
    		}
            if (f == flength)
    			break;
        }
    	printfPercent(100);
    
        if (j > 0)                                                      //当剩余字符数量少于8个时
        {
            strcat(buf, "00000000");
            for (i = 0; i < 8; i ++)
            {
                if (buf[i] == '1') c = (c << 1) | 1;
                else c = c << 1;                                        //对不足的位数进行补零
            }
            fwrite(&c, 1, 1, ofp);
            pt1 ++;
        }
        fseek(ofp, 0, SEEK_SET);                                        //将编码信息写入存储文件
    	fwrite(&flength,1,sizeof(flength),ofp);
        fwrite(&pt1, sizeof(long), 1, ofp);
        fseek(ofp, pt1, SEEK_SET);
        fwrite(&n, sizeof(long), 1, ofp);
        for (i = 0; i < n; i ++)
        {
    		tmp = header[i];
    
            fwrite(&(header[i].b), 1, 1, ofp);
    		pt1++;
            c = strlen(header[i].bits);
            fwrite(&c, 1, 1, ofp);
    		pt1++;
            j = strlen(header[i].bits);
    
            if (j % 8 != 0)                                             //当位数不满8时,对该数进行补零操作
            {
                for (f = j % 8; f < 8; f ++)
                    strcat(header[i].bits, "0");
            }
    
            while (header[i].bits[0] != 0)
            {
                c = 0;
                for (j = 0; j < 8; j ++)
                {
                    if (header[i].bits[j] == '1') c = (c << 1) | 1;
                    else c = c << 1;
                }
                strcpy(header[i].bits, header[i].bits + 8);
                fwrite(&c, 1, 1, ofp);                                            //将所得的编码信息写入文件
    			pt1++;
            }
    
    		header[i] = tmp;
        }
        fclose(ifp);
        fclose(ofp);                                                              //关闭文件
    
    	printf("压缩后文件为:%s\n",outputfile);
        printf("压缩后文件有:%d字符\n",pt1 + 4);
    
        return 1;                                       //返回压缩成功信息
    }
    
    
    //函数:uncompress()
    //作用:解压缩文件,并将解压后的内容写入新文件
    int uncompress(const char *filename,const char *outputfile)
    {
        char buf[255], bx[255];
        unsigned char c;
    	char out_filename[512];
        long i, j, m, n, f, p, l;
        long flength;
    	int per = 10;
    	int len = 0;
        FILE *ifp, *ofp;
    	char c_name[512] = {0};
        ifp = fopen(filename, "rb");                                              //打开文件
        if (ifp == NULL)
        {
            return 0;     //若打开失败,则输出错误信息
        }
    
    													  //读取原文件长
    	if(outputfile)
    		strcpy(out_filename,outputfile);
    	else
    		strcpy(out_filename,c_name);
    
        ofp = fopen(out_filename, "wb");                                            //打开文件
        if (ofp == NULL)
        {
            return 0;
        }
    
    	fseek(ifp,0,SEEK_END);
    	len = ftell(ifp);
    	fseek(ifp,0,SEEK_SET);
    
    	printf("将要读取解压的文件:%s\n",filename);
    	printf("当前文件有:%d字符\n",len);
    	printf("正在解压\n");
    
        fread(&flength, sizeof(long), 1, ifp);                                    //读取原文件长
        fread(&f, sizeof(long), 1, ifp);
        fseek(ifp, f, SEEK_SET);
        fread(&n, sizeof(long), 1, ifp);                                          //读取原文件各参数
        for (i = 0; i < n; i ++)                                                  //读取压缩文件内容并转换成二进制码
        {
            fread(&header[i].b, 1, 1, ifp);
            fread(&c, 1, 1, ifp);
            p = (long) c;
            header[i].count = p;
            header[i].bits[0] = 0;
            if (p % 8 > 0) m = p / 8 + 1;
            else m = p / 8;
            for (j = 0; j < m; j ++)
            {
                fread(&c, 1 , 1 , ifp);
                f = c;
                _itoa(f, buf, 2);
                f = strlen(buf);
                for (l = 8; l > f; l --)
                {
                    strcat(header[i].bits, "0");                                  //位数不足,执行补零操作
                }
                strcat(header[i].bits, buf);
            }
            header[i].bits[p] = 0;
        }
    
        for (i = 0; i < n; i ++)
        {
            for (j = i + 1; j < n; j ++)
            {
                if (strlen(header[i].bits) > strlen(header[j].bits))
                {
                    tmp = header[i];
                    header[i] = header[j];
                    header[j] = tmp;
                }
            }
        }
    
        p = strlen(header[n-1].bits);
        fseek(ifp, 8, SEEK_SET);
        m = 0;
        bx[0] = 0;
    
    
        while (1)
        {
            while (strlen(bx) < (unsigned int)p)
            {
                fread(&c, 1, 1, ifp);
                f = c;
                _itoa(f, buf, 2);
                f = strlen(buf);
                for (l = 8; l > f; l --)
                {
                    strcat(bx, "0");
                }
                strcat(bx, buf);
            }
            for (i = 0; i < n; i ++)
            {
                if (memcmp(header[i].bits, bx, header[i].count) == 0) break;
            }
            strcpy(bx, bx + header[i].count);
            c = header[i].b;
            fwrite(&c, 1, 1, ofp);
            m ++;
    
    		if(100 *  m/flength > per)
    		{
    			printfPercent(per);
    			per += 10;
    		}
            if (m == flength) break;
        }
    	printfPercent(100);
    
        fclose(ifp);
        fclose(ofp);
    
    	printf("解压后文件为:%s\n",out_filename);
        printf("解压后文件有:%d字符\n",flength);
    
        return 1;                   //输出成功信息
    }
    
    int main(int argc,const char *argv[])
    {
    	memset(&header,0,sizeof(header));
        memset(&tmp,0,sizeof(tmp));
    
    	compress("测试文档.txt","测试文档.txt.zip");
    	uncompress("测试文档.txt.zip","测试文档.txt 解压后.txt");
    	system("pause");
    
    	return 0;
    }
    

     

    2 功能展示

    2.1 控制台显示

    2.2 文件效果

    开始时只有一个文件《测试文档.txt》:

    打开《测试文档.txt》

    《测试文档.txt》文件大小:

    程序运行结束后多了两个文件:

    以文本形式打开压缩二进制文件《测试文档.txt.zip》:

    《测试文档.txt.zip》文件属性:

    展开全文
  • 解压缩解压缩解压缩解压缩解压缩解压缩解压解压缩缩
  • Linux命令之解压缩:tar、zip、rar 命令

    万次阅读 多人点赞 2018-09-11 09:16:57
    解压缩是一个常用的操作,在 Linux 中通常比较常用的是 tar 命令,zip 和 rar 命令则是 Windows 中比较常用。 二、快速使用 1. tar 命令 语法: tar [主选项 + 辅选项] 文件或目录 示例: # 压缩文件 file1 ...

    一、简介

    解压缩是一个常用的操作,在 Linux 中通常比较常用的是 tar 命令,zip 和 rar 命令则是 Windows 中比较常用。

     

    二、快速使用

    1. tar 命令

    语法: tar [主选项 + 辅选项] 文件或目录

    示例:

    # 压缩文件 file1 和目录 dir2 到 test.tar.gz
    tar -zcvf test.tar.gz file1 dir2
    # 解压 test.tar.gz(将 c 换成 x 即可)
    tar -zxvf test.tar.gz
    # 列出压缩文件的内容
    tar -ztvf test.tar.gz 

    释义:

    -z : 使用 gzip 来压缩和解压文件

    -v : --verbose 详细的列出处理的文件

    -f : --file=ARCHIVE 使用档案文件或设备,这个选项通常是必选的

    -c : --create 创建一个新的归档(压缩包)

    -x : 从压缩包中解出文件

    其它:

    tar 命令其实并不是真的解压缩的处理者,而是使用了 gzip 或者 bzip2 等其它命令来达成,但是 gzip 等命令通常只能处理单个文件,并不方便,所以一般我们都是选择使用 tar 命令间接的完成解压缩。

     

    2. rar 命令

    示例:

    # 压缩文件
    rar a -r test.rar file
    # 解压文件
    unrar x test.rar

    释义:

    a : 添加到压缩文件

    -r : 递归处理

    x : 以绝对路径解压文件

     

    3. zip 命令

    示例:

    # 压缩文件
    zip -r test.zip file
    # 解压文件
    unzip test.zip

    释义:

    -r : 递归处理

     

    三、tar 命令详解

    1. 语法:

    tar [-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b <区块数目>][-C <目的目录>][-f <备份文件>][-F <Script文件>][-K <文件>][-L <媒体容量>][-N <日期时间>][-T <范本文件>][-V <卷册名称>][-X <范本文件>][-<设备编号><存储密度>][--after-date=<日期时间>][--atime-preserve][--backuup=<备份方式>][--checkpoint][--concatenate][--confirmation][--delete][--exclude=<范本样式>][--force-local][--group=<群组名称>][--help][--ignore-failed-read][--new-volume-script=<Script文件>][--newer-mtime][--no-recursion][--null][--numeric-owner][--owner=<用户名称>][--posix][--erve][--preserve-order][--preserve-permissions][--record-size=<区块数目>][--recursive-unlink][--remove-files][--rsh-command=<执行指令>][--same-owner][--suffix=<备份字尾字符串>][--totals][--use-compress-program=<执行指令>][--version][--volno-file=<编号文件>][文件或目录...]

    2. 参数详解:

    -A或--catenate 新增文件到已存在的备份文件。
    -b<区块数目>或--blocking-factor=<区块数目设置每笔记录的区块数目,每个区块大小为12Bytes。
    -B或--read-full-records 读取数据时重设区块大小。
    -c或--create 建立新的备份文件。
    -C<目的目录>或--directory=<目的目录切换到指定的目录。
    -d或--diff或--compare 对比备份文件内和文件系统上的文件的差异。
    -f<备份文件>或--file=<备份文件指定备份文件。
    -F<Script文件>或--info-script=<Script文件每次更换磁带时,就执行指定的Script文件。
    -g或--listed-incremental 处理GNU格式的大量备份。
    -G或--incremental 处理旧的GNU格式的大量备份。
    -h或--dereference 不建立符号连接,直接复制该连接所指向的原始文件。
    -i或--ignore-zeros 忽略备份文件中的0 Byte区块,也就是EOF。
    -k或--keep-old-files 解开备份文件时,不覆盖已有的文件。
    -K<文件>或--starting-file=<文件从指定的文件开始还原。
    -l或--one-file-system 复制的文件或目录存放的文件系统,必须与tar指令执行时所处的文件系统相同,否则不予复制。
    -L<媒体容量>或-tape-length=<媒体容量设置存放每体的容量,单位以1024 Bytes计算。
    -m或--modification-time 还原文件时,不变更文件的更改时间。
    -M或--multi-volume 在建立,还原备份文件或列出其中的内容时,采用多卷册模式。
    -N<日期格式>或--newer=<日期时间只将较指定日期更新的文件保存到备份文件里。
    -o或--old-archive或--portability 将资料写入备份文件时使用V7格式。
    -O或--stdout 把从备份文件里还原的文件输出到标准输出设备。
    -p或--same-permissions 用原来的文件权限还原文件。
    -P或--absolute-names 文件名使用绝对名称,不移除文件名称前的"/"号。
    -r或--append 新增文件到已存在的备份文件的结尾部分。
    -R或--block-number 列出每个信息在备份文件中的区块编号。
    -s或--same-order 还原文件的顺序和备份文件内的存放顺序相同。
    -S或--sparse 倘若一个文件内含大量的连续0字节,则将此文件存成稀疏文件。
    -t或--list 列出备份文件的内容。
    -T<范本文件>或--files-from=<范本文件指定范本文件,其内含有一个或多个范本样式,让tar解开或建立符合设置条件的文件。
    -u或--update 仅置换较备份文件内的文件更新的文件。
    -U或--unlink-first 解开压缩文件还原文件之前,先解除文件的连接。
    -v或--verbose 显示指令执行过程。
    -V<卷册名称>或--label=<卷册名称建立使用指定的卷册名称的备份文件。
    -w或--interactive 遭遇问题时先询问用户。
    -W或--verify 写入备份文件后,确认文件正确无误。
    -x或--extract或--get 从备份文件中还原文件。
    -X<范本文件>或--exclude-from=<范本文件指定范本文件,其内含有一个或多个范本样式,让ar排除符合设置条件的文件。
    -z或--gzip或--ungzip 通过gzip指令处理备份文件。
    -Z或--compress或--uncompress 通过compress指令处理备份文件。
    -<设备编号><存储密度设置备份用的外围设备编号及存放数据的密度。
    --after-date=<日期时间此参数的效果和指定"-N"参数相同。
    --atime-preserve 不变更文件的存取时间。
    --backup=<备份方式>或--backup 移除文件前先进行备份。
    --checkpoint 读取备份文件时列出目录名称。
    --concatenate 此参数的效果和指定"-A"参数相同。
    --confirmation 此参数的效果和指定"-w"参数相同。
    --delete 从备份文件中删除指定的文件。
    --exclude=<范本样式排除符合范本样式的问家。
    --group=<群组名称把加入设备文件中的文件的所属群组设成指定的群组。
    --help 在线帮助。
    --ignore-failed-read 忽略数据读取错误,不中断程序的执行。
    --new-volume-script=<Script文件此参数的效果和指定"-F"参数相同。
    --newer-mtime 只保存更改过的文件。
    --no-recursion 不做递归处理,也就是指定目录下的所有文件及子目录不予处理。
    --null 从null设备读取文件名称。
    --numeric-owner 以用户识别码及群组识别码取代用户名称和群组名称。
    --owner=<用户名称把加入备份文件中的文件的拥有者设成指定的用户。
    --posix 将数据写入备份文件时使用POSIX格式。
    --preserve 此参数的效果和指定"-ps"参数相同。
    --preserve-order 此参数的效果和指定"-A"参数相同。
    --preserve-permissions 此参数的效果和指定"-p"参数相同。
    --record-size=<区块数目此参数的效果和指定"-b"参数相同。
    --recursive-unlink 解开压缩文件还原目录之前,先解除整个目录下所有文件的连接。
    --remove-files 文件加入备份文件后,就将其删除。
    --rsh-command=<执行指令设置要在远端主机上执行的指令,以取代rsh指令。
    --same-owner 尝试以相同的文件拥有者还原问家你。
    --suffix=<备份字尾字符串移除文件前先行备份。
    --totals 备份文件建立后,列出文件大小。
    --use-compress-program=<执行指令通过指定的指令处理备份文件。
    --version 显示版本信息。
    --volno-file=<编号文件使用指定文件内的编号取代预设的卷册编号。

     

    四、rar 命令和 zip 命令详解

    这两个命令在 Linux 下使用的不是很多,这里不详解介绍了。

    参考中文文档:rarunrarzipunzip

    展开全文
  • 蓝梦数据解压缩为数据解压缩软件之一,支持文件拖放、数据压缩、数据解压等功能。
  • 解压缩解压缩软件解压缩软件解压缩软件解压缩软件解压缩软件解压缩软件解压缩软件解压缩软件解压缩软件解压缩软件解压缩软件解压缩软件解压缩软件
  • RAR解压缩 GPU运行解压缩,不注册也可以使用的。一样的。
  • Java解压缩zip - 解压缩多个文件或文件夹

    万次阅读 多人点赞 2012-09-19 12:56:50
    Java解压缩zip - 多个文件(包括文件夹) 对多个文件和文件夹进行压缩,对复杂的文件目录进行解压。 压缩方法使用的是可变参数,可以压缩1到多个文件..可以写数组的方式或者一个个写到参数列表里面... ZipFiles(zip...

    Java解压缩zip - 多个文件(包括文件夹)

     

    对多个文件和文件夹进行压缩,对复杂的文件目录进行解压。

    压缩方法使用的是可变参数,可以压缩1到多个文件..可以写数组的方式或者一个个写到参数列表里面...

     

    ZipFiles(zip,"abc",new File("d:/English"),new File("d:/发放数据.xls"));

     

     

    测试文件目录结构:

     

    测试的压缩内容:English文件夹和同级的两个excel文件

     

    File[] files = new File[]{new File("d:/English"),new File("d:/发放数据.xls"),new File("d:/中文名称.xls")};


    下面是压缩的代码:

     

     

    /**
    	 * 压缩文件-由于out要在递归调用外,所以封装一个方法用来
    	 * 调用ZipFiles(ZipOutputStream out,String path,File... srcFiles)
    	 * @param zip
    	 * @param path
    	 * @param srcFiles
    	 * @throws IOException
    	 * @author isea533
    	 */
    	public static void ZipFiles(File zip,String path,File... srcFiles) throws IOException{
    		ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zip));
    		ZipTest.ZipFiles(out,path,srcFiles);
    		out.close();
    		System.out.println("*****************压缩完毕*******************");
    	}
    	/**
    	 * 压缩文件-File
    	 * @param zipFile  zip文件
    	 * @param srcFiles 被压缩源文件
    	 * @author isea533
    	 */
    	public static void ZipFiles(ZipOutputStream out,String path,File... srcFiles){
    		path = path.replaceAll("\\\\", "/");
    		if(!path.endsWith("/")){
    			path+="/";
    		}
    		byte[] buf = new byte[1024];
    		try {
    			for(int i=0;i<srcFiles.length;i++){
    				if(srcFiles[i].isDirectory()){
    					File[] files = srcFiles[i].listFiles();
    					String srcPath = srcFiles[i].getName();
    					srcPath = srcPath.replaceAll("\\\\", "/");
    					if(!srcPath.endsWith("/")){
    						srcPath+="/";
    					}
    					out.putNextEntry(new ZipEntry(path+srcPath));
    					ZipFiles(out,path+srcPath,files);
    				}
    				else{
    					FileInputStream in = new FileInputStream(srcFiles[i]);
    					System.out.println(path + srcFiles[i].getName());
    					out.putNextEntry(new ZipEntry(path + srcFiles[i].getName()));
    					int len;
    					while((len=in.read(buf))>0){
    						out.write(buf,0,len);
    					}
    					out.closeEntry();
    					in.close();
    				}
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}

     

     

    在压缩的时候,针对文件夹进行判断,然后递归压缩文件。

     

     

     

     

     

     

    然后是解压:

     

    /**
    	 * 解压到指定目录
    	 * @param zipPath
    	 * @param descDir
    	 * @author isea533
    	 */
    	public static void unZipFiles(String zipPath,String descDir)throws IOException{
    		unZipFiles(new File(zipPath), descDir);
    	}
    	/**
    	 * 解压文件到指定目录
    	 * @param zipFile
    	 * @param descDir
    	 * @author isea533
    	 */
    	@SuppressWarnings("rawtypes")
    	public static void unZipFiles(File zipFile,String descDir)throws IOException{
    		File pathFile = new File(descDir);
    		if(!pathFile.exists()){
    			pathFile.mkdirs();
    		}
    		ZipFile zip = new ZipFile(zipFile);
    		for(Enumeration entries = zip.entries();entries.hasMoreElements();){
    			ZipEntry entry = (ZipEntry)entries.nextElement();
    			String zipEntryName = entry.getName();
    			InputStream in = zip.getInputStream(entry);
    			String outPath = (descDir+zipEntryName).replaceAll("\\\\", "/");;
    			//判断路径是否存在,不存在则创建文件路径
    			File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
    			if(!file.exists()){
    				file.mkdirs();
    			}
    			//判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
    			if(new File(outPath).isDirectory()){
    				continue;
    			}
    			//输出文件路径信息
    			System.out.println(outPath);
    			
    			OutputStream out = new FileOutputStream(outPath);
    			byte[] buf1 = new byte[1024];
    			int len;
    			while((len=in.read(buf1))>0){
    				out.write(buf1,0,len);
    			}
    			in.close();
    			out.close();
    			}
    		System.out.println("******************解压完毕********************");
    	}


    解压的时候,针对文件夹判断创建不存在的文件夹,对文件夹只创建,不进行解压..因为解压是针对文件的,不是文件夹,文件夹需要自己创建。

     

     

     

     

    测试方法:

     

    public static void main(String[] args) throws IOException {
    		/**
    		 * 压缩文件
    		 */
    		File[] files = new File[]{new File("d:/English"),new File("d:/发放数据.xls"),new File("d:/中文名称.xls")};
    		File zip = new File("d:/压缩.zip");
    		ZipFiles(zip,"abc",files);
    		
    		/**
    		 * 解压文件
    		 */
    		File zipFile = new File("d:/压缩.zip");
    		String path = "d:/zipfile/";
    		unZipFiles(zipFile, path);
    	}


    测试方法并没有对异常做任何处理,这是不对的,请不要模仿。

     

    输出结果:

     

    abc/English/templete.xls
    abc/English/中文/csdn/isea/533/abc/templete.xls
    abc/English/中文/csdn/isea/533/abc/zipfile2/templete.xls
    abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/templete.xls
    abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/zipfile2/templete.xls
    abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/zipfile2/领卡清单.xls
    abc/English/中文/csdn/isea/533/abc/zipfile2/领卡清单.xls
    abc/English/中文/csdn/isea/templete.xls
    abc/English/中文/csdn/isea/领卡清单.xls
    abc/English/中文/csdn/templete.xls
    abc/English/领卡清单.xls
    abc/发放数据.xls
    abc/中文名称.xls
    *****************压缩完毕*******************
    d:/zipfile/abc/中文名称.xls
    d:/zipfile/abc/发放数据.xls
    d:/zipfile/abc/English/领卡清单.xls
    d:/zipfile/abc/English/中文/csdn/templete.xls
    d:/zipfile/abc/English/中文/csdn/isea/领卡清单.xls
    d:/zipfile/abc/English/中文/csdn/isea/templete.xls
    d:/zipfile/abc/English/中文/csdn/isea/533/abc/templete.xls
    d:/zipfile/abc/English/templete.xls
    d:/zipfile/abc/English/中文/csdn/isea/533/abc/zipfile2/templete.xls
    d:/zipfile/abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/templete.xls
    d:/zipfile/abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/zipfile2/templete.xls
    d:/zipfile/abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/zipfile2/领卡清单.xls
    d:/zipfile/abc/English/中文/csdn/isea/533/abc/zipfile2/领卡清单.xls
    ******************解压完毕********************

     

     


     

    展开全文
  • C# 压缩解压缩

    2019-04-10 14:32:38
    C# 压缩解压缩,其中包含了通过递归的方式对文件夹进行压缩及解压缩操作
  • 推荐 OS X 下最方便实用的六款解压缩软件

    万次阅读 多人点赞 2019-06-19 09:50:36
    对于我们这种资料特别多,随时都需要跟工作伙伴沟通传递资料的人来说,一款方便的压缩软件真的太重要了,不仅可以节省时间,节省内存,更重要的是提高工作效率,今天废鱼就给大家推荐几款常用压缩软件。 The ...

    对于我们这种资料特别多,随时都需要跟工作伙伴沟通传递资料的人来说,一款方便的压缩软件真的太重要了,不仅可以节省时间,节省内存,更重要的是提高工作效率,今天废鱼就给大家推荐几款常用压缩软件。

     

    The Unarchiver 

    The Unarchiver行为与系统自带的工具一致,文件类型图标精致有爱,操作简单易用, 可以帮助你存储不同类型的档案文件! 可以打开一些常见格式的文件,比如Zip、Rar... 也可以打开一些较老格式的文件,比如ARJ、ARC... 你使用它打开文件时它会自动检测和修正文件编码, 使你在任何地方都不会得到乱码的文章。

    下载:http://www.macbl.com/app/system/the-unarchiver

     

    Archiver

    Archiver是一个非常多才多艺的解压缩工具,它可以解压你所有的档案。如你有一个文件太大,无法放在磁盘上或通过电子邮件发送?借助Archiver,您可以将文件分割成任意大小的较小文件。可以压缩拆分文件来挤出一些额外的空间。当然,Archiver也可以通过加密档案保护您的文件,同时,你也可以将文件们拖到Archiver中来,提取多个档案同时解压。

    下载:http://www.macbl.com/app/system/archiver

     

    BetterZip

    BetterZip是一款功能强大的压缩工具,它可以不解压就能预览文件,支持ZIP,TAR,TGZ,TBZ,TXZ等多种格式的文件。此外,它还能让文件在Windows 和Linux系统中兼容。

    下载:http://www.macbl.com/app/utilities/betterzip

     

    Dr. Unarchiver

    在正版的Mac解压缩软件中,免费又好用的解压软件确实是非常少见的,它像解压缩界一股清流。Dr.Unarchiver支持所有常见格式:如RAR、7z、ZIP、XZ、BZIP2、GZIP、RAR、WIM、ARJ、CAB、CHM、CPIO、CramFS、DEB、DMG、FAT、HFS、ISO、LZH、LZMA、MBR、MSI、NSIS、NTFS、RPM、SquashFS、UDF、VHD、WIM、XAR 以及 Z等。

     

    下载:http://www.macbl.com/app/utilities/dr.-unarchiver

     

    Rar Sharp

    Rar Sharp for mac是一款Mac上的压缩解压缩工具,支持常用的压缩格式,如rar, zip, gzip, tar等格式,支持压缩包内文件预览、解压缩部分内容、密码加密、拖拽压缩解压等功能。

    下载:http://www.macbl.com/app/system/rar-sharp

     

    keka

    一开始是被keka的图标吸引过来,虫子恐惧症的患者还是不要尝试去下载了。但是撇开图标不谈,keka是一款优秀又小巧的压缩、解压缩软件,速度很快还支持Growl,压缩时也不会把OSX的fork类隐藏文件也给压进去。它所支持的文件压缩格式:7z, Zip, Tar, Gzip, Bzip2;支持的文件解压缩格式:RAR, 7z, Lzma, Zip, Tar, Gzip, Bzip2, ISO, EXE, CAB, PAX, ACE (PPC)等。

    下载:http://www.macbl.com/app/system/keka

     

    以上就是今天推荐的六款解压缩软件,如果你也知道哪些实用的压缩软件,欢迎在下面留言,本文将不定时更新,我们下次见咯~

    展开全文
  • 哈夫曼压缩与解压缩

    万次阅读 多人点赞 2018-08-13 12:52:01
    哈夫曼压缩与解压缩 目录 哈夫曼压缩与解压缩 一:引言 二:主要技术点 三:过程介绍 1、压缩: 2、解压缩 四:详细分析 一:准备过程 二:压缩 三:解压缩 五:结果演示 六:总结 七:源码地址 一:...
  • 常用的解压缩软件rar解压缩软件解压缩软件
  • 手机解压缩软件

    2018-03-09 21:38:07
    手机解压缩软件,亲测非常好用!可以解压缩的东西有很多,有些电脑上不能解压缩的这个软件也可以解压缩
  • jpg文件解压缩并显示 jpg解压缩算法

    热门讨论 2012-02-08 13:40:30
    jpg文件解压缩并显示 jpg解压缩算法实现
  • 压缩 解压缩 压缩 解压缩 压缩 解压缩 压缩 解压缩
  • Java Lib来压缩(压缩)或解压缩解压缩)文件和文件夹。 转到项目的Wiki,以查看如何使用和使用此lib的示例
  • 在线解压缩在线解压缩
  • 文件压缩解压缩

    2018-07-06 14:41:21
    简单的一个工具类,支持zip、rar、tar等的压缩解压缩,亲自测过可用
  • Oracle压缩解压缩文件|Oracle压缩解压缩文件|Oracle压缩解压缩文件
  • c++ zip 压缩 解压缩

    2014-07-31 14:32:32
    c++ zip 压缩 解压缩,有工程,直接可编译运行。可以实现压缩文件,文件夹,解压缩
  • c# 压缩解压缩源码

    2012-05-03 16:41:21
    c# 压缩解压缩源码,实现文件文件夹的压缩解压缩功能。仿压缩解压缩工具。
  • 一款好用的解压缩工具。一款好用的解压缩工具。一款好用的解压缩工具。一款好用的解压缩工具。一款好用的解压缩工具。一款好用的解压缩工具。一款好用的解压缩工具。一款好用的解压缩工具。
  • 解压缩软件

    2011-09-07 21:41:42
    解压缩软件 好东西谁用谁知道解压缩软件 好东西谁用谁知道解压缩软件 好东西谁用谁知道解压缩软件 好东西谁用谁知道
  • Jbig解压缩

    2013-09-03 15:57:16
    Jbig解压缩,还原bmp图片。
  • c/c++zip压缩解压缩

    千次下载 热门讨论 2010-07-09 19:35:25
    这个是目前最简单傻瓜式的,基于c/c++ 的压缩解压缩程序。 操作非常简单。里面有教程,有图。 有源代码。
  • 在线解压缩工具

    2015-02-21 17:55:34
    在线解压缩工具
  • php 在线 压缩 解压缩

    2010-02-05 19:31:43
    php 在线 压缩 解压缩 很好用 php 在线 压缩 解压缩 很好用 php 在线 压缩 解压缩 很好用 php 在线 压缩 解压缩 很好用
  • C# zip文件解压缩

    2016-07-14 14:58:41
    C# zip文件解压缩 只能实现一级目录的解压缩
  • 审计AO新中大备份解压缩、新中大采集备份解压缩,具有 解压和压缩 功能
  • iOS用ZipArchive文件解压缩、压缩文件
  • 使用Mac电脑,无论是解压软件还是压缩软件,都需要一款功能强大的Mac解压缩软件,一款好用的Mac解压缩软件能够让你的工作更有效率,打包和解压数据更稳定更安全。那么,MAC上好用的解压缩软件有哪些呢?哪款苹果Mac...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 369,754
精华内容 147,901
关键字:

解压缩