标签: 7zip

我们应该使用什么压缩格式; 我们应该让DEFLATE(.zip)休息吗?

由于大多数Linux发行版都放弃了gzip和bzip2来支持LZMA2来压缩它们的包,以及许多平台上的许多开源实现,我想知道:我们不应该将DEFLATE和.zip格式(不幸的是一遍又一遍地反复)放弃,并继续采用其他现代方式分发我们的(源)包?

GNU tar支持J交换机,它使用xz(另一个LZMA2压缩器)作为过滤器:

$ tar cJf foo.tar.xz foo/
Run Code Online (Sandbox Code Playgroud)

但是,我倾向于使用7z(p7zip实现),它是7zaLinux下的朋友,用于创建存档.在创建档案时,我仍然使用"避免tar-bombs"范例,这意味着档案中有一个目录,因此从命令行中提取不会导致当前目录中的文件溢出(这是Linux上的标准运作方式,类似于tar,但在Windows下,它似乎要少得多.

无论如何,似乎由于在软件包中使用(例如Fedora RPMs和Ubuntu DEB),以及tarLZMA2是bzip2后使用的"下一个最好的东西" 等工具的过滤器.它具有很高的压缩率(在标准设置中远远超过bzip2)并且速度非常快(压缩比gzip略慢,

我自己做了一些基准测试,但我想在一些更广泛的基准测试中转向现场:

现在,你会注意到,作为参考实现的7-zip并没有出现在第一位.然而,Freearc使用它自己的.arc格式,这不是真正的跨平台能力,与80年代的 ARC 不兼容.nanozip不是开源的,这是一种低迷,但它的算法很重要,而不是归档!

无论如何,现在使用7-zip及其派生实现(xz)的性能不再是问题,并且压缩率本身就说明了,我想将我的源包分发为.7z.tar.xz存档.但是,我面前有两个障碍,我似乎无法接受:

  1. WinRAR的倡导者.不要误会我的意思,我对WinRAR或其用户没有怨恨,只是我不能在Linux上真正制作RAR,而且没有必要,因为我们有免费的LZMA2工具.正如我所说,自从成为发行包的一个组成部分后,它可以在任何现代发行版中使用.由于需要大约在同一时间做出.7z.rar和LZMA2文件一般都比较小,我不明白为什么不能使用7-Zip.

  2. tar档案必须是zip或bzip2,没有例外.这很难.为什么有这么多人对gzip印象深刻?甚至bzip2在大多数情况下都没有看到太多用法.当然,gzip很快,对于按需压缩(如Web服务器或创建大型镜像备份)而言,这是一个很好的观点.但是分发软件怎么样?LZMA2 非常不对称.虽然压缩需要时间,但解压缩速度非常快.

好的,现在我的问题出现了:

既然LZMA2可以说是下一个更好的压缩算法,为什么人们不会跳上火车呢?为什么人们仍然使用专有的WinRAR,压缩率较差,并且没有移植到Linux(除了unrar,但你显然无法创建存档).为什么Tarball仍然大部分都是gziped?

难道没有办法说服人们转向更新,更可靠的归档格式,这不仅是跨平台的,而且是免费的吗?当我给某人一个文件结尾时.7z,他们往往不知道该怎么做,这会改变吗?

哦,这是我自己做的小基准.我到处使用默认设置:

11837440 GNUtar_TAR.tar
10657984 Arc_ARC.arc
9632524 PA2010_TAR_BZip2.tar.bz2
9536967 PA2010_LHA_Frozen5.lzh
9510148 PA2010_ZIP_BZip2.zipx
9490211 …
Run Code Online (Sandbox Code Playgroud)

compression zip gzip 7zip winrar

11
推荐指数
1
解决办法
3069
查看次数

将7z文件视为.NET流

我想链接多个流操作(例如下载文件,动态解压缩,以及处理没有任何临时文件的数据).这些文件是7z格式.有一个LZMA SDK可用,但强制我创建一个外部输出流而不是一个流本身 - 换句话说,输出流必须完全写入才能使用它.SevenZipSharp似乎也缺少这个功能.

有没有人这样做过?

// in pseudo-code - CompressedFileStream derives from Stream
foreach (CompressedFileStream f in SevenZip.UncompressFiles(Web.GetStreamFromWeb(url))
{
    Console.WriteLine("Processing file {0}", f.Name);
    ProcessStream( f ); // further streaming, like decoding, processing, etc
}
Run Code Online (Sandbox Code Playgroud)

每个文件流的行为类似于表示一个文件的一次性读取流,并且在主压缩流上调用MoveNext()会自动使该文件无效并跳过该文件.

可以进行类似的构造以进行压缩.示例用法 - 对非常大量的数据进行一些聚合 - 对于dir中的每个7z文件,对于每个文件内部,对于每个文件中的每个数据行,总结一些值.

更新2012-01-06

#ziplib(SharpZipLib)已经完成了我需要的带有ZipInputStream类的zip文件.下面是一个示例,它将所有文件生成为给定zip文件中不可搜索的流.仍在寻找7z解决方案.

IEnumerable<Stream> UnZipStream(Stream stream)
{
    using (var zipStream = new ZipInputStream(stream))
    {
        ZipEntry entry;
        while ((entry = zipStream.GetNextEntry()) != null)
            if (entry.IsFile)
                yield return zipStream;
    }
}
Run Code Online (Sandbox Code Playgroud)

.net compression 7zip stream

11
推荐指数
1
解决办法
1007
查看次数

7zip最快的LZMA2压缩

如何将这些设置转换为命令?

存档创建选项的屏幕截图

Archiv format:7z
compression level: Fastest
Compression method: LZMA2
Dictionary size: 64kb
Word size: 32
Solid Block size: 8MB
Number of CPU threads: 30
Run Code Online (Sandbox Code Playgroud)

我试过这个:

"7z.exe" a -t7z "F:\BACKUP" "D:\Source" -m0=LZMA2:d=64k
Run Code Online (Sandbox Code Playgroud)

压缩是好的,但使用GUI需要3个小时,而不是1小时.我查看了文档,但我无法理解.

compression command-line 7zip batch-file

11
推荐指数
1
解决办法
9562
查看次数

7-zip命令行

我正在创建一个备份实用程序,用于压缩文本文件中列出的所有文件.我使用MS ACCESS作为我的前端和7-Zip进行压缩.这些是我正在使用的命令:

7zG.exe a c:\Backup\backup.zip
@c:\temp\tmpFileList.txt
Run Code Online (Sandbox Code Playgroud)

所有文件都在没有路径的情况下被压缩.有没有办法在zip文件中包含每个文件的路径?然后,当backup.zip提取时,文件将恢复到其原始文件夹结构.

谢谢

command-line 7zip

10
推荐指数
2
解决办法
11万
查看次数

使用7z @listfile功能在不同文件夹中压缩具有相同名称的文件

我想使用7zip的@listfile功能创建一个包含相同名称但在不同文件夹中的文件的7zip文件.虽然我已经使用了7zip CLI很长一段时间,但我找不到完成此任务的语法.

我的文件树看起来像这样(注意somefile1.html和somefile2.html每次出现两次).

|   somefile2.html
+---dir1
|       somefile1.html
|       somefile2.html
|       
+---dir2
|       somefile3.html
|       somefile4.html
|       
\---dir3
        somefile1.html
        somefile5.html
Run Code Online (Sandbox Code Playgroud)

使用@listfile工作正常,但我无法弄清楚如何在生成7zip时保留目录树.

我尝试了以下语法:

7z a -ir@files.txt my_compressed_file.7z

然后,考虑到7zip的Windows CHM帮助文件在语法下的解释,我尝试包括根文件夹(称为"文件"):

7z a -ir@files.txt my_compressed_file.7z.\ files

我在两种情况下都得到同样的错误:

Error
Duplicate filename:
somefile1.html
somefile2.html
Run Code Online (Sandbox Code Playgroud)

有没有人想出这个,并想关注它?

我知道如何在不同的文件夹中压缩具有相同名称的文件(当7zip中保留文件夹结构时没问题).但是这次我需要的几个文件遍布整个地方......

compression directory 7zip duplicates

10
推荐指数
3
解决办法
1万
查看次数

正确解码zip条目文件名 - CP437,UTF-8或?

我最近写了一个名为zipzap的zip文件I/O库,但我正在努力正确解码任意zip文件中的zip条目文件名.

现在,PKWARE规范指出:

D.1 ZIP格式历史上只支持原始的IBM PC字符编码集,通常称为IBM Code Page 437 ...

D.2如果未设置通用位11,则文件名和注释应符合原始ZIP字符编码.如果设置了通用位11,则文件名和注释必须使用UTF-8存储规范定义的字符编码格式支持Unicode标准版本4.1.0或更高版本...

这意味着符合的zip文件将文件名编码为CP437,除非设置了EFS位,在这种情况下文件名为UTF-8.

不幸的是,似乎许多zip工具要么没有正确设置EFS位(例如Mac CLI,GUI zip),要么使用其他一些编码,通常是默认的系统编码(例如WinZip?).如果您知道WinZip,7-Zip,Info-Zip,PKZIP,Java JAR/Zip,.NET zip,dotnetzip等如何编码文件名以及他们将"版本制作"字段设置为压缩时,请告诉我.

特别是,Info-Zip在解压缩时会尝试这样做:

  • 文件系统= MS-DOS(0)=> CP437
    • 除外:版本= 2.5,2.6,4.0 => ISO 8859-1
  • 文件系统= HPFS(6)=> CP437
  • 文件系统= NTFS(10)和版本= 5.0 => CP437
  • 否则,ISO 8859-1

如果我想支持检查或从任意zip文件中提取并在没有EFS标志的情况下合理地尝试文件名编码,我还能找到什么?

zip jar 7zip zipfile winzip

10
推荐指数
2
解决办法
6731
查看次数

在cmd中解压缩文件时出错(在Windows中使用7z)

我试图通过命令行使用7 Zip.如下所示,使用该命令7z l列出目标zip文件中的3个文件.

C:\Users\User1\Downloads>7z l recording_20130731180507.zip

--
Path = recording_20130731180507.zip
Type = zip
Physical Size = 311686

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2013-07-31 18:05:06 .....          655          655  SD_DISK\20130731\18\2013073
1_180505_A4BC_00408CC2B40B\recording.xml
2013-07-31 18:05:06 .....       309752       309752  SD_DISK\20130731\18\2013073
1_180505_A4BC_00408CC2B40B\20130731_18\20130731_180505_59EB_00408CC2B40B.mkv
2013-07-31 18:05:06 .....          279          279  SD_DISK\20130731\18\2013073
1_180505_A4BC_00408CC2B40B\20130731_18\20130731_180505_59EB_00408CC2B40B.xml
------------------- ----- ------------ ------------  ------------------------
                                310686       310686  3 files, 0 folders
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试实际解压缩文件时,我得到一个"没有文件来处理错误".我以前从未试过从cmd解压缩.我是否必须尝试挖掘zip文件来提取这3个文件?

C:\Users\User1\Downloads>7z e recording_20130731180507.zip o-C:\users\User1\do
cuments\folder1\test


No files to process

Files: 0
Size:       0
Compressed: 311686
Run Code Online (Sandbox Code Playgroud)

cmd 7zip

10
推荐指数
1
解决办法
5974
查看次数

没有管理员权限的7zip Self Extracting Archive(SFX)

我使用7zip创建SFX如下:

7z.exe a -r archive.7z *
Run Code Online (Sandbox Code Playgroud)

然后我用7zS.sfx文件(用于创建自解压安装程序),配置文件"build.config"和存档进行二进制复制.配置文件的内容如下:

;!@Install@!UTF-8!
RunProgram="setup.exe"
GUIMode="1"
Path="%tmp%\\mytemp"
;!@InstallEnd@!
Run Code Online (Sandbox Code Playgroud)

二进制复制命令如下:

copy /b 7zS.sfx + build.config + archive.7z sfxInstaller.exe
Run Code Online (Sandbox Code Playgroud)

问题是结果SFX"sfxInstaller.exe"需要管理员权限才能执行.是否可以使用不需要管理员权限的7-Zip生成自解压档案?如果是这样,我应该使用哪些参数/命令行参数?提前致谢.

permissions 7zip archive sfx

9
推荐指数
1
解决办法
1万
查看次数

在powershell中使用7z解压文件

在powershell中使用7z解压缩文件的命令是什么?

set-alias sz "$env:ProgramFiles\7-Zip\7z.exe"
sz x  $zipfilePath $destinationUnzipPath -aoa -r;
Run Code Online (Sandbox Code Playgroud)

该命令工作正常,但它说没有要处理的文件,一切正常而不是解压缩文件?

powershell 7zip

9
推荐指数
3
解决办法
3万
查看次数

无需额外的外部软件即可将.bat转换为.exe(创建SFX)

按照与本指南相同的步骤操作.我试图从bat转换为exe而不安装任何新的软件,如Bat to Exe Converter.我使用这种方法的原因是因为我工作场所中的所有机器都安装了7zip并且可以使用它,但我不允许使用主服务器上不存在的外部软件使脚本工作,以便在任何机器上兼容公司.

我有以下TEST.bat:

ECHO This is a Test bat to exe
pause
Run Code Online (Sandbox Code Playgroud)

config.txt:

;!@Install@!UTF-8! 
RunProgram="TEST.bat" 
;!@InstallEnd@! 
Run Code Online (Sandbox Code Playgroud)

然后我调用以下命令行(在另一个.bat中):

COPY /B "%PathTo7Zip%\7zCon.sfx" + %Config% + %Source7ZFile% %OutputFile%
Run Code Online (Sandbox Code Playgroud)

%PathTo7Zip%7zCon.sfx 的目录%Config%是上面的config.txt文件 %Source7ZFile%是我的.7z存档,并且%OutputFile%是我的输出TEST.exe文件,应该根据指南的作者调用它时应该运行bat文件.但是,调用TEST.exe触发器解压缩.7z存档(这是预期的),然后退出而不运行TEST.bat.

然而,作者解释说:

结论:

请务必注意,虽然生成的文件与源BAT文件运行完全相同,但这不是真正的批处理到可执行转换.生成的文件是EXE,但它旨在用于自解压安装程序.当您执行生成的EXE文件时,该过程如下所示:

  1. EXE文件的内容将解压缩到临时目录.
  2. 读取脚本生成的配置文件.
  3. EXE文件中包含的批处理文件在新的命令窗口中执行.
  4. 完成后,将删除临时文件.

windows 7zip batch-file

9
推荐指数
1
解决办法
3万
查看次数