精华内容
下载资源
问答
  • 我从apache网站上下载的apache-activemq-5.2.0-bin.zip这个压缩文件为什么不能解压开?我下载apache-activemq-5.1.0-bin.zip以及apache-activemq-5.0.0-bin.zip这两个版本也都打不开,不知道为什么,在解压缩的时候...
  • 面对一个 ZIP,能不能「边下边播」、「按需下载」? 今年 6 月,优酷绘本技术团队开发出新的解压方式——ZIP 流式解压技术,并成功应用在优酷绘本秒开项目中,30M+ 绘本平均加载时长只需 0.91s,加载耗时比传统的...

    打开网络上的 ZIP 文件需要几步?下载,解压,拿到所有文件。面对一个 ZIP,能不能「边下边播」、「按需下载」?

    今年 6 月,优酷绘本技术团队开发出新的解压方式——ZIP 流式解压技术,并成功应用在优酷绘本秒开项目中,30M+ 绘本平均加载时长只需 0.91s,加载耗时比传统的解压方式降低了 88.3%,让用户的阅读体验直线提升。

    本文将介绍 ZIP 流式解压的原理和技术实现路径,希望为大家带来启发,将 ZIP 流式解压技术更多的应用到业务中。

    一 什么是ZIP

    ZIP 是一种文件格式,定义了如何将多个文件、数据块组织在一起形成一个完整的文件。例如我们常见的 .apk,.ipa,.sketch,都是ZIP文件。通常程序是这样创建 ZIP 文件的:

    • 压缩单个文件形成单文件数据块;
    • 在数据块前后添加文件描述信息;
    • 对每个待压缩的文件重复以上步骤后,拼接所有数据形成更大的数据块;

    提取所有文件描述信息,生成一份「文件目录」,附在最后一个数据块的尾部。

    我们将文件前部描述信息称为 Local File Header,文件后部描述信息称为 Data Descriptor, 被压缩的文件本身称为 File Data,将最后的文件目录称为 Central Directory。以上所有合在一起,就是一个标准的 ZIP 文件。如下图:

    9989c5b90f96dedb20d3e717592eeed2c54bdb86.jpeg

    一个标准的解压方式总是从读取 ZIP 文件末尾开始的,我们以解压上图的 File Data 1 为例:

    9989c5b90f96dedb20d3e717592eeed2c54bdb86.jpeg

    • 首先在 ZIP 文件末尾找到 Central Directory 数据块;
    • 在 Central Directory 数据块中找到 File Header 1;
    • 从 File Header 1 中读取 Local File Header 1 的偏移量和 File Data 1 的相关信息;
    • 根据偏移量找到 Local File Header 1;
    • 读取 Local File Header 1;
    • 解密 File Data 1(如果需要);
    • 解压 File Data 1;
    • 读取 Data Descriptor 1;
    • 使用 File Header 1 中保存的 CRC-32 做校验步骤 7 中计算的 CRC-32,以确保解压后的数据完整性。

    标准解压方式存在的不足

    可以发现,标准的解压强依赖尾部的 Central Directory。当 ZIP 文件存储在 cdn 上时,哪怕我们只想访问其中的一个文件,也必须下载整个 ZIP 解压后才可访问。假如 ZIP 文件有 100 MB,但是我们只需要访问其中的某一个 10 KB 的文件,那么下载整个 ZIP 将是对流量的巨大浪费。

    二 优酷技术方案:ZIP流式解压

    我们的一个初步的想法是能不能边下载边解压?

    要实现这点,首先需要改变解压方式,使其不能再依赖尾部的 Central Directory。

    根据 ZIP 文件格式标准可知,除了 Central Directory,每个 File Data 头部的 Loca File Header 部分也包含了该文件的相关信息。

    假如 Local File Header 中包含了充分的信息,我们也许可以基于 Local File Header 去解压文件数据,其解压流程就可以变为:

    9989c5b90f96dedb20d3e717592eeed2c54bdb86.jpeg

    • 从头开始,搜索到 Local File Header 1;
    • 读取 Local File Header 1;
    • 解密 File Data 1(如果需要);
    • 解压 File Data 1;
    • 读取 Data Descriptor 1;
    • CRC32 的校验。
    • 那么 Local File Header 里到底存储了什么?是否满足解密解压所需?

    了解 Local File Header

    我们根据文档对 Local File Header 的描述,画出其二进制文件中的排列:

    9989c5b90f96dedb20d3e717592eeed2c54bdb86.jpeg

    其中的关键信息为:

    9989c5b90f96dedb20d3e717592eeed2c54bdb86.jpeg

    元数据签名是一个 Magic Number,用来标记接下来数据是什么内容。例如 Local File Header 的签名是 0x04034b50,用 char 表示也就是 { ‘P’, ‘K’, ‘3’, ‘4’ }。当读取到对应数据签名时,则意味着接下来的数据结构符合对应元数据的定义,需要使用对应规则解析。

    Compress Method 指明数据块用何种算法压缩,解压需要使用对应的算法。

    Compressed Size 和 UnCompressed Size可以帮助确定文件的结尾地址和 Data Descriptor 的偏移量。这两个 Size 也是文件解密时 HMAC 计算的关键。

    有了 Magic Number 作为元数据签名,我们只需要逐字节遍历去匹配这个 Number,就可以找到 Loca File Header,而不再需要依赖尾部的定位信息。而且 Local File Header 中存储的元数据足够我们决定解压算法、计算大小、校验 CRC-32 了。

    还有一个问题是,解压缩算法是否支持流式解压缩?是否有特定的上下文依赖?通过了解压缩算法的原理[1],我们知道,所有的压缩算法都是支持从头部开始流式解压的。

    而下载方面,文件是以从头到尾连续的方式下载,这又天然地和和从头解压的方式配合,便可以初步实现边下边解!

    加密 ZIP 文件的问题

    一切都相当顺利,直到遇到了加密后的 ZIP 文件。加密后的 ZIP 文件的 Local File Header 中的关键信息除了签名和文件名以外,其他信息都被隐去,需要去 Central Directory 中读取。

    再一次,我们回到了依赖 Central Directory 的状态。

    在失去如此多关键信息的情况下能否继续做到流式解压?我们需要先挖掘一下 ZIP 的加密方式。

    ZIP 的加密方式

    ZIP 文件支持多种加密方式,最常见的是 Traditional PKWARE Encryption 和 AES Encryption 。

    Traditional PKWARE Encryption 是 ZIP 自定义的一种基于密码的对称加密方式,每个字节的加密仅和密码有关,加密前后的数据长度不变。这种不依赖上下文的加密方式可以实现我们需要的流式解密。

    AES 加密采用的是 CTR 模式。CTR 模式将明文分组,并生成一个计数器。使用密钥对计数器进行加密生成二进制字节流。利用这个字节流和明文进行 XOR 操作进行加密。其解密方式也是一样的。

    这种方式也支持流式解密。

    9989c5b90f96dedb20d3e717592eeed2c54bdb86.jpeg

    两种常用的加密方式都支持流式解密,那么加解密需要的关键信息,在 Local File Header 中是否有存储就成了能否流式解密的关键。

    流式解密的关键信息

    无论是 Traditional PKWARE Encryption 还是 AES Encryption,在解密时都需要一些除密码之外的关键信息,例如盐值,加密算法的强度等。此外,在 AES 加密的 ZIP 文件中, Local File Header 中的 Compress Method 字段被抹去,这样我们便无法知晓压缩算法,因此无法解压。

    至此,问题集中为:

    • Local File Header 中是否有足够的加密所需信息。
    • 加密的 ZIP 文件,是否能在除 Central Directory 以外的位置找到 Compress Method 字段。

    Local File Header 中加密相关的信息
    ZIP 格式的设计者在设计 ZIP 文件格式的初期就提供了文件拓展能力,一些额外的拓展数据可以存放在 Local File Header 的 Extra Field 中。ZIP AES 加密说明书[2]告诉我们 AES 的相关信息就存放在这里。其关键信息如下:

    9989c5b90f96dedb20d3e717592eeed2c54bdb86.jpeg

    原来压缩算法被藏到了 Extra Data 中。那么盐值被存放在哪里了?答案是存放在 File Data 的头尾。

    9989c5b90f96dedb20d3e717592eeed2c54bdb86.jpeg

    综上,我们找到解密所需的所有关键信息,整个流式解密解压的所有技术点都被我们探索完。剩下的便是按原理实现,以及细节的打磨。

    三 总结

    说了那么多,流式解压究竟有什么价值呢?

    由于流式解压实现了边下载边解压,将整个操作的时长从下载 + 解压缩变成了约等于纯下载的时长,直接抹掉了解压的耗时。在 39.1 MB 大小的 ZIP 包下载解压测试中,耗时从 9.08 秒降低至 4.17 秒,有将近 100% 的提速!同时,你可以不必等待整个 ZIP 下载解压完,而是在解压完一小部分数据的时候,就直接展示 UI。用户侧看起来就好像一瞬间就解压完了。

    因此,流式解压可以应用在许多时间敏感的操作里,也可以用来优化基于 ZIP 文件的相关业务。例如基于 ZIP 的全局换肤加速、基于 ZIP 的 Web 资源缓存加载的加速等等。前言中的优酷绘本秒开就是基于这一技术实现。

    参考

    https://houbb.github.io/2018/11/09/althgorim-compress-althgorim-12-zip-02
    [2]AES Encryption Information: Encryption Specification AE-1 and AE-2
    https://www.winzip.com/win/en/aes_info.html
    [3]ZIP File Format Specification
    https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.2.1.TXT
    [4]AES Coding Tips for Developers
    https://www.winzip.com/win/en/aes_tips.html

    展开全文
  • 上传解压了还是不能write。 <p style="text-align:center"><img alt="" src="https://img-ask.csdnimg.cn/upload/1623400439659.png" /></p> <p>2. 用jupyter 重新从win10上传了另一个zip文件(这个压缩...
  • 首先说明一下本文的需求:利用Windows自带的API、DLL或命令行参数等任何手段,解压一个标准的zip压缩文件,并且...之所以要强调不借助第三方软件,是因为程序发布到客户电脑后,不能指望(或要求)客户电脑里必须有...

            首先说明一下本文的需求:利用Windows自带的API、DLL或命令行参数等任何手段,解压一个标准的zip压缩文件,并且不借助任何第三方程序。

    一、前言——徒劳的探索

            为什么会提出这种需求呢?因为我近期在编程中,需要在程序运行时解压一个zip文件,然后使用解压出来的文件。之所以要强调不借助第三方软件,是因为程序发布到客户电脑后,不能指望(或要求)客户电脑里必须有解压缩软件,因此利用Windows自带的解压缩功能是最保险的一个办法。我本来以为这是一个非常简单的需求,因为我在使用新装的Windows时,文件管理器(Explorer.exe)都能直接提取zip文档,因此我认为只要找到文件管理器里使用的解压方式或是命令行参数,直接应用到我的程序里就万事大吉了。

            然而,事情并没有我想的那么简单。我搜遍了百度谷歌,各种中文英文论坛,网友们给出的方向无非两条路。第一条路,Windows自带的zip解压功能位于zipfldr.dll中,只要弄清楚怎么利用这个dll文件就行了。然而这个dll并没有提供公开的接口或命令行参数,唯一提供的还有点用的接口RouteTheCall只能显示压缩文件,并不能解压文件。关于为什么这个dll不对外提供服务,网上也是众说纷纭,有的说是这个dll文件功能还有缺陷,所以微软不想公开参数;也有的说因为现在解压缩zip文件的第三方软件、代码太多了,微软没必要再单独提供一个接口了等云云。真实的原因我们不去考证,但是总结起来就是一句话,这条路行不通。第二条路,包括在Microsoft官方论坛上,有很多人说直接安个7-zip或者Winrar就能用命令行解压了。或者有人没说的这么直白,他们说你用个开源且免费的zlib(或其他开源代码),然后就能很容易解压zip软件了。甚至更有很多自以为大师的小白说,打开cmd,输入如下参数,就能解压了:unzip.exe mydata.zip –XXXXXX(或是winrar.exe –x …….)。这些方式确实能解压,但是却与我的需求背道而驰,我的需求是不能借助任何第三方的程序便实现zip文档的解压。走这条路的一部分人也算实在,明确说这是利用第三方程序实现的,不利用第三方程序实现不了,另一部分“大师”级小白却信誓旦旦地说,这就是Windows自带的解压(难道仅仅因为是命令要打到cmd里就算是Windows自带的解压方式了?)。除了上述两条基本路线,还有一些比较冷门的说法,比如有人说Windows自带的解压程序是expand.exe,用这个可以解压zip。这个程序其实只能解压.cab文档,之所以有人说这个能解压zip是因为他们把一个文件的扩展名从.cab改成了.zip,然后用expand解压,这样当然能解压了。如果是一个标准的zip,用expand是无论如何也解压不了的(即使把文件扩展名改成.cab)。总之,经过数日的搜索与求助,结论是没有任何一种方法可以不借助第三方程序解压标准的zip。

    二、进阶——思路的转变

            既然网上没有答案,那就自己解决,就像我当年研究0xc000007b问题时一样(详见《运行游戏时出现0xc000007b错误的解决方法》),网上到处都是提问的,但是没有一个回答是有效的。这次也是,网上回答虽然多,但是没有能完全满足我的需求的。首先需要梳理一下我的思路。我原来计划的思路是:

    1、得到一个zip压缩文件;2、用Windows自带的程序(或命令行等)解压这个zip文件;3、使用解压出来的文件(包括运行、复制、移动、重命名等)

            在这个思路下,第2步就卡住了,后续自然也没有后续了。但是仔细回忆一下,我当时产生这个需求的时候为什么觉得这个需求应该很简单呢?因为我在使用原版Windows的时候,在文件管理器里只要双击就可以打开zip文档,并且在文件管理器里可以浏览压缩包里的所有文件,然后只要在要运行的程序上双击,就可以自动运行那个文件。整个过程就像打开一个普通文件夹,然后双击我要运行的程序一样那样自然,几乎感觉不到这是个压缩文档,中间还要有解压过程。那我的程序能不能也用这个思路解决呢?比如像这样:

    1、得到一个zip压缩文件;2、打开这个zip压缩文档;3、运行我要运行的文件

            在新思路的指引下我开始了我的尝试,然后我意外的发现,这个方式居然成功了,我完全不去考虑到底要怎么解压,我就把这个zip文档当成一个普通的文件夹在文件管理器中打开,然后运行我要运行的程序。当我运行这个程序时,Windows自己在后台便帮我把文件解压好了,程序运行起来就像已经解压好后再双击运行一样。

    三、方法——代码的实现

            下面我把实现的方法通过VB.NET代码的形式展现出来,大家可以根据上面的思路结合代码自行应用到其他语言上,或者直接在cmd命令行里运行也行。

            第1步,首先找到一个示例的标准zip文档,里面有exe程序,也有txt文档,这里以我的DirectX修复工具在线修复版为例,如图1:

    图1

    图1. 示例zip文档及文档内文件

            从上面的图标可以看出来,我的系统里没装任何第三方解压缩软件,只能通过Windows Explorer打开。

            第2步,新建一个空程序,主窗体上画2个Button,然后打入代码(如图2)。Button1中的代码是用来打开非exe文件的,Button2中的代码是用来打开exe文件的。

    图2. 示例代码
    Public Class Form1
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            '打开一个zip压缩文件中的非exe文件
            Dim appID As Integer
            appID = Shell("explorer ""C:\Users\zhangyue\Desktop\DirectXRepair_3.8_Online.zip\DirectXRepair_3.8_Online\使用说明.txt""", AppWinStyle.NormalFocus)
            'appID = Shell("explorer ""C:\Users\zhangyue\Desktop\DirectXRepair_3.8_Online.zip\DirectXRepair_3.8_Online\Data\A\xinput1_1.dll""", AppWinStyle.NormalFocus)
        End Sub
    
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            '打开一个zip压缩文件中的exe文件
            Dim appID As Integer
            appID = Shell("explorer ""C:\Users\zhangyue\Desktop\DirectXRepair_3.8_Online.zip\DirectXRepair_3.8_Online\DirectX Repair.exe""", AppWinStyle.NormalFocus)
            Threading.Thread.Sleep(1000) '需要一定的延迟,确保Explorer弹出对话框后再发送字母U
            My.Computer.Keyboard.SendKeys("U")
        End Sub
    End Class

            第3步,单击Button1,可以看到使用说明.txt就被打开了,没有一丝延迟,完全感受不到压缩文档的存在,就像文档已经解压好一样,直接打开(如图3)。Button1中的代码可以推广到打开所有的非exe文件上。

    VBcom
    图3. 直接打开(解压)zip文档中的txt文件

            如果我们需要打开的是exe文件,假如也用Button1中的代码,只是文件名换成XXX.exe的话,文件管理器会弹出一个对话框,如图4。

    图4. Explorer.exe询问用户希望如何打开exe文件

            这个提示的原因是因为,通常exe运行时,需要调用其文件夹中的dll文件或其他配置文件,方能正常运行,所以Windows会询问用户是否需要全部解压这个zip文档,还是只运行你选定的exe文件。由于DirectX Repair.exe不需要调用任何dll文件,所以上图中的对话框应该选择第二个按钮“运行”。关于这个选择,我们也可以自动化完成,通过添加2行代码(如图5),即可实现自动点击按钮并正常运行程序。之所以发送字母U,是因为如图4中,“运行”按钮的快捷键为U。

    图5. 新增延迟代码和按键代码
            Threading.Thread.Sleep(1000) '需要一定的延迟,确保Explorer弹出对话框后再发送字母U
            My.Computer.Keyboard.SendKeys("U")

            第4步,单击Button2,可以看到DirectX修复工具主界面就被打开了。虽然代码上会有一点点延时,但是毕竟还是自动化操作,还算可以接受。如图6。

    图6. 直接打开(解压)zip文档中的exe文件

            代码中的延时代码非常重要,如果没有延时,文件管理器还没弹出这个询问框时,可能程序就把按键发过去了,这样就会造成无法实现自动启动。关于具体延时需要多少毫秒,这个大家可以自行设置。

    四、提高——疑问的解答

            说到这大家可能会有几个疑问,我来一一解答。

            问题1,有的时候我不只需要运行压缩包里的文件,我需要复制、重命名或是提供命令参数运行等操作,这个怎么实现?以刚才第4步打开的DirectX Repair.exe为例,一旦这个文件运行起来了,那么这个文件其实就已经被解压了存在于你的电脑上了,只要到系统文件夹的Temp文件夹里找到解压出来的exe文件(如图7),那么你想对它做任何事都随意了(图中示例路径为:C:\Users\zhangyue\AppData\Local\Temp\Temp1_DirectXRepair_3.8_Online.zip\DirectXRepair_3.8_Online\DirectX Repair.exe)。

    图7. 可在系统Temp文件夹中找到已经解压出来的exe文件

            问题2,我的exe程序还需要zip文档里dll文件等支持,怎们办?这时在运行你的程序之前,先按照之前的第3步,把dll文件打开,然后另存到你需要的目录下,将来运行exe时,到系统Temp文件夹中把exe也拷贝到你需要的目录下,这样就可以运行了。关于如何打开dll文件,我再给个提示,先到注册表里,把dll文件的默认打开方式设置为记事本(如图8),当按照第3步打开时,打开的就是一个记事本,只要把这个记事本保存并重命名为dll文件,即相当于对这个dll文件进行了解压。让dll文件通过记事本打开的注册表具体位置为:Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dll\UserChoice\Progid,值为:Applications\NOTEPAD.EXE

    图8. 在注册表中设置默认通过记事本打开dll文件

            问题3,我想后台操作,怎么办?这点我还没有实践,不过思路已经有了,就是首先后台通过explorer打开一个zip压缩文档,然后利用Windows API函数,把这个explorer中的文件默默拷贝出来,然后再关掉这个后台explorer,即相当于在后台把这个zip文档解压到了指定的文件夹。

    五、结语——艰难的开端

            关于我文中提到的方法,我毫不掩饰的说,并不完美,和我们的理想还有一定的差距。但是,这个方法是目前能满足我的需求的唯一方法。第三方软件固然方便,但是并不满足我的需求;zipfldr.dll也许可以实现我的需求,但是目前我(包括大家)并没有找到解决方法。万事开头难,从无到有是最困难的,虽然目前的方法不甚完美,但毕竟解决了有无问题,可以先用着,未来再不断研究新方法,改进实现的方式。就好比10年前我研究0xc000007b问题时,我最开始给大家提出的解决方案是安装DirectX9.0。虽然安装DirectX9.0不是100%有效,但是最起码解决了0xc000007b问题解决方案有无的问题,给大家指明了一个方向。后续针对0xc000007b问题发布的DirectX修复工具,再到后来的DirectX修复工具增强版,可以说已经可以解决现在市面上95%的问题了,已经接近完美了。

            关于用Windows自带程序(或命令)解压zip文档的方案,我相信未来也可以变得更加高效、更加完美。如果各位对我的方案有任何意见或者建议,一定要及时告诉我,希望我们大家可以共同提高。

    展开全文
  • 关于为什么解压zip包时会出现中文乱码,可以参考博客Android中解压zip中文乱码处理,主要原因就是不同的操作系统压缩文件时采用的编码方式不同, windows默认是GBK编码方式, mac系统默认的文字编码格式是utf-8。...

    解压zip文件中文乱码

    参考博客:

    Android中解压zip中文乱码处理

    android通过org.apache.tools.zip解压zip压缩文件,支持中文名

    关于为什么解压zip包时会出现中文乱码,可以参考博客Android中解压zip中文乱码处理,主要原因就是不同的操作系统压缩文件时采用的编码方式不同, windows默认是GBK编码方式, mac系统默认的文字编码格式是utf-8。

    解决方案: 由于java自带的解压缩包不能在压缩文件中存在中文名,使用apache的开发包org.apache.tools.zip可以支持中文。我们可以直接引用该包,但是Apache的包相对于Android说有点偏大不适合于Android环境,所以我们可以找到解压缩的那部分代码进行改造即可。此处自己直接引用该包。

    apache-ant-zip.jar包可以自行搜索下载, 将此jar包复制到工程的libs目录下,在代码头部需要导入下面的包:

    import org.apache.tools.zip.ZipEntry;
    import org.apache.tools.zip.ZipFile;
    

    解压缩的相关代码参考博客android通过org.apache.tools.zip解压zip压缩文件,支持中文名, 相关代码如下:

    
    	/**
    	 * 使用 org.apache.tools.zip.ZipFile 解压文件,它与 java 类库中的 java.util.zip.ZipFile
    	 * 使用方式是一新的,只不过多了设置编码方式的 接口。
    	 *
    	 * 注,apache 没有提供 ZipInputStream 类,所以只能使用它提供的ZipFile 来读取压缩文件。
    	 *
    	 * @param archive 压缩包路径
    	 * @param decompressDir  解压路径
    	 * @throws IOException
    	 * @throws FileNotFoundException
    	 * @throws ZipException
    	 */
    	public static void readByApacheZipFile(String archive, String decompressDir)
    			throws IOException, FileNotFoundException, ZipException {
    		BufferedInputStream bi;
    		ZipFile zf = new ZipFile(archive, "GBK");// 支持中文
    
    		Enumeration e = zf.getEntries();
    		while (e.hasMoreElements()) {
    			ZipEntry ze2 = (ZipEntry) e.nextElement();
    			String entryName = ze2.getName();
    			String path = decompressDir + "/" + entryName;
    			if (ze2.isDirectory()) {
    				Log.d("readByApacheZipFile", "正在创建解压目录 - " + entryName);
    				File decompressDirFile = new File(path);
    				if (!decompressDirFile.exists()) {
    					decompressDirFile.mkdirs();
    				}
    			} else {
    				Log.d("readByApacheZipFile", "正在创建解压文件 - " + entryName);
    				String fileDir = path.substring(0, path.lastIndexOf("/"));
    				File fileDirFile = new File(fileDir);
    				if (!fileDirFile.exists()) {
    					fileDirFile.mkdirs();
    				}
    				BufferedOutputStream bos = new BufferedOutputStream(
    						new FileOutputStream(decompressDir + "/" + entryName));
    				bi = new BufferedInputStream(zf.getInputStream(ze2));
    				byte[] readContent = new byte[1024];
    				int readCount = bi.read(readContent);
    				while (readCount != -1) {
    					bos.write(readContent, 0, readCount);
    					readCount = bi.read(readContent);
    				}
    				bos.close();
    			}
    		}
    		zf.close();
    	}
    

    压缩相关代码

     ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outputFileName));
     out.setEncoding("GBK");
    
    
    //调用压缩的方法
    zip(out, new File(inputFileName), "");
    
    private void zip(ZipOutputStream out, File f, String base)
                throws Exception {
    
            if (f.isDirectory()) {// 文件夹
                File[] fl = f.listFiles();
                out.putNextEntry(new ZipEntry(base + "/"));
                base = base.length() == 0 ? "" : base + "/";
                for (int i = 0; i < fl.length; i++) {
                    System.out.println("i=" + i + "," + fl[i].getName());
                    zip(out, fl[i], base + fl[i].getName());
                }
            } else {// 文件
                if (base.length() == 0) {// 当base为空时,表示是压缩指定的一个文件,否则就是压缩文件夹下的所有文件
                    base = f.getName();
                }
                out.putNextEntry(new ZipEntry(base));
                FileInputStream in = new FileInputStream(f);
                int b;
                byte[] buffer = new byte[1024];// 提高文件压缩的速度
                while ((b = in.read(buffer)) != -1) {
                    out.write(buffer, 0, b);
                }
                in.close();
            }
    
    }
    
    展开全文
  • 苹果电脑为什么解压不了压缩文件?这个问题估计会是很多苹果电脑用户解压文件时的疑问。那么你是否注意到解压不了的压缩包是什么类型的。是rar还是zip?有些细心的用户可能会发现在Mac系统上rar等格式的压缩文件被...

    苹果电脑为什么解压不了压缩文件?这个问题估计会是很多苹果电脑用户解压文件时的疑问。那么你是否注意到解压不了的压缩包是什么类型的。是rar还是zip?有些细心的用户可能会发现在Mac系统上rar等格式的压缩文件不被支持解压。

    在苹果电脑上可以支持解压zip格式的压缩文件,但例如rar格式的压缩格式就不被支持了。这里可能会存在一个误区——一些人会认为只有zip和rar格式的压缩文件,但其实不是,还有数十种压缩格式但是我们并不常用。同样地这些不常用的其他格式也不能被Mac系统解压。

    那如果我们要在苹果电脑上解压其他压缩格式的文件该怎么办呢?下面我要告诉大家一个简单又强大的工具来解决这个问题。那就是BetterZip。这款强大的压缩软件可以完成不仅限于解压压缩文件的功能。它更有高效管理、增加文件安全性等实用功能。我们来一起了解一下吧。

    图 1:欢迎来到BetterZip

    一、文件解压

    为压缩文件解压是BetterZip for Mac的主要功能。这款软件可以帮助Mac用户解压各种格式的文件,让用户在Mac系统上不再仅仅局限于系统支持的压缩格式。

    图 2:压缩文件

    二、文件管理

    文件管理这个功能让我们在解压文件前,可以对压缩包内的文件直接管理。比如对压缩包内的内容删除、添加。正因为如此,这个功能也使得BetterZip的操作更加简洁,体验感更加丰满。

    三、安全加密

    对压缩包内的文件数据加密是这款Mac解压缩软件的一大特色之处。我们可以对压缩文件设置安全密码以增加文件的安全性。在压缩文件时我们可以选择输入密码的加密方式,或者在预置保存中可以设置加密项,然后为压缩文件添加密码防止其他人盗用。

    图 3:设置密码

    以上就是对BetterZip for Mac特色功能的简单介绍。当我们在使用Mac系统不能很好地解压缩和压缩文件时就可以使用它来帮助我们,提高我们的效率。

    BetterZip for Mac点击免费下载

    BetterZip for Mac使用技巧查看

    展开全文
  • 还有好多配置config文件的,搞为什么要这样做,,,, 所以写了以下内容,俺也不是太了解,装上,正常用就行,所以写了以下内容,这种安装方式挺简洁的,Share 如下: MongoDB下载地址: ...
  • 在这篇教程里,我将演示如何在iOS应用内压缩和解压文件。我们会使用到一个叫做ZipArchive的第三方库来实现这一功能。虽然还有其他压缩和解压文件的方案,但我感觉...苹果强制要求通过3G网络下载的应用大小不能超过50...
  • Android端解压ZIP文件中文乱码的问题

    千次阅读 2018-11-11 23:04:12
    为解决这个问题,在网上徘徊了数小时,被那些盲目搬砖的博主坑死,明明可行的方案为什么还要搬到自己的口袋呢?这些人真害人浅,浪费彼此时间!!!吐槽到此为止。上代码: 正文 首先呢,实现此功能用到的核心工具类...
  • asset里不能放中文名怎么办,先把要用的文件压缩,然后写到机器里,然后从机器里读,然后解压回机器。。。。。。。(是这样的。。。) 1.1创建libs目录,拷入ant.jar,在ant.jar上右击,选择addAsLibary。(为什么...
  • 则必须将归档后缀(tar)与压缩格式后缀(zip、gz、bz2)都正确指定,因为Windows是按压缩文件的后缀来判断调用解压格式的,并且 如果不加归档后缀(tar)只有压缩格式后缀,Windows解压出来的咚咚将不能被识别文件夹,...
  • 接上步.也就是成功后(表示有今天的文档,具体就...(可能有人会问,为什么删除数据不放前面.因为不能保证是否有今天文档.其实也有一个方法.就是用时序容器的事务性.当遍历文件失败后因事务就会还原删除的数据.可惜我不...
  • 国内虽然推出了免费个人版,但是却加了弹窗广告,这是很不能容忍的。而且目前国内代理商发布的 WinRAR 5.80 正式中文版还有个明显的 BUG,到底有没有认真在做软件??? 360 ZIP 压缩国际版 360 ZIP 中文版360 ZIP ...
  • phpZipExt.dll 辅助 phpZip 运行的 DLL(没有此DLL程序也可以运行,但不能与Explorer集成) ------------------------------------------------------- 修改记录: 16:25 2003-11-29: 增加 phpZipExt.dll ,使得...
  • 修复数组嵌套多级,里面子数组不能格式化的Bug Alcatraz 支持 Alcatraz ,请搜索ESJsonFormat 效果: 简单模型 复杂模型 图中的JSON格式 {  "name": "王五...
  • 遇到了一个奇怪的问题,用unachiver压缩并解压文件,文件名如果是ZHEZHANG.zip不能解压并报错,如果是ZHE ZHANG.zip就完全没有问题。为什么一个空格差别这么大
  • 曼格短视频 1.3.4.zip

    2020-04-16 22:36:12
    为不让之前选择我们的客户失望!只要在视频下面添加上你的名片,分享出去就会携带,别人点击你分享的视频,自动展现你的名片,还给你留言,香吗??想做什么都可以! 解压密码 d36d4a53c06c3ec516b7da25f0c)#...
  • 解压缩oracle 10g的10201_database_win32.zip\database.zip压缩包,解压完毕执行Oracle安装的先决条件,然后知道为何居然报内存错误。很郁闷,请各位大侠帮忙解决下这个问题。这是什么原因啊?请看   截图如下:...
  • 这到底是为什么呢? 查看zipfile的源码后,终于找到原因: if zinfo.flag_bits & 0x800: # UTF-8 filename fname_str = fname.decode("utf-8") else: fname_str = fname.decode("cp437") 原来编码不能被正确...
  • Mac下unzip解压文件名乱码问题

    千次阅读 2018-10-29 13:25:13
    前言 zip为windows平台常用压缩文件格式,在团队协作中,经常会碰到同事发过来的zip格式压缩文件。...为什么unzip不能handle这种情况? unzip有很多的版本,而适合用在MAC OS上的版本很多不支持指定编码格式。这...
  • 压缩、解压 大文件 C#

    2016-04-18 04:03:22
    如何用c#写一个压缩、解压的文件 文件大小1G左右。我用 ICSharpCode.SharpZipLib.Zip;这个组件,只能实现小文件的压缩,不能实现大文件的压缩,一压缩就报错。哪位有什么好的方法实现大文件压缩呢。
  • 因为 7z 和 zip 压缩格式都不能保留 unix 风格的文件权限,比如解压出个可执行文件要重新 chmod chown 才能恢复正常。而 tar 格式可以。而 tar 本身不提供压缩,无非就是把包括所有文件的內容和权限拼成一个文件而己...
  •  -QUpdater关心您的软件升级过程,无论用户使用的是1.0/2,0什么的,直接对比分析用户使用的版本和最新版。  -服务器部署最新版的软件文件(压缩/压缩都均可),QUpdater对比分析服务器和客户的软件文件,不同...
  • fex-team.github.io.zip

    2019-07-19 09:06:32
    为什么某篇文章没显示出来? 你确定放到 _posts 下了是吧? 有可能是用了 {% xxx }%,因为页面会当成 Liquid 模板进行解析,所以请使用 {% raw %}{% xxx %}{% endraw %} 来包含起来 那你肯定没在本地预览过,...
  • 论坛里的朋友介绍了几种用第三方安装程序制作软件,方法都非常好,但是好像不能解压matlab Runtime MCRInstaller.exe,这里再介绍一种新方法,可以在deploytool中的 19.JPG package...
  • 论坛里的朋友介绍了几种用第三方安装程序制作软件,方法都非常好,但是好像不能解压matlab Runtime MCRInstaller.exe,这里再介绍一种新方法,可以在deploytool中的 19.JPG package...
  • 论坛里的朋友介绍了几种用第三方安装程序制作软件,方法都非常好,但是好像不能解压matlab Runtime MCRInstaller.exe,这里再介绍一种新方法,可以在deploytool中的 19.JPG package...
  • (1)市场购买的光盘,放入光驱后可直接导入GHO.(2)网上下载的一般光盘ISO格式,需要先解压(或用虚拟光驱加载ISO)再导入.(3)其它同型号电脑产生的GHO可保存到移动U盘,再将U盘插入本机直接导入.(4)导入时想覆盖旧GHO,...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 151
精华内容 60
关键字:

为什么zip不能解压