由于大多数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实现),它是7za
Linux下的朋友,用于创建存档.在创建档案时,我仍然使用"避免tar-bombs"范例,这意味着档案中有一个目录,因此从命令行中提取不会导致当前目录中的文件溢出(这是Linux上的标准运作方式,类似于tar
,但在Windows下,它似乎要少得多.
无论如何,似乎由于在软件包中使用(例如Fedora RPMs和Ubuntu DEB),以及tar
LZMA2是bzip2后使用的"下一个最好的东西" 等工具的过滤器.它具有很高的压缩率(在标准设置中远远超过bzip2)并且速度非常快(压缩比gzip略慢,
我自己做了一些基准测试,但我想在一些更广泛的基准测试中转向现场:
现在,你会注意到,作为参考实现的7-zip并没有出现在第一位.然而,Freearc使用它自己的.arc
格式,这不是真正的跨平台能力,与80年代的旧 ARC 不兼容.nanozip不是开源的,这是一种低迷,但它的算法很重要,而不是归档!
无论如何,现在使用7-zip及其派生实现(xz)的性能不再是问题,并且压缩率本身就说明了,我想将我的源包分发为.7z
或.tar.xz
存档.但是,我面前有两个障碍,我似乎无法接受:
WinRAR的倡导者.不要误会我的意思,我对WinRAR或其用户没有怨恨,只是我不能在Linux上真正制作RAR,而且没有必要,因为我们有免费的LZMA2工具.正如我所说,自从成为发行包的一个组成部分后,它可以在任何现代发行版中使用.由于需要大约在同一时间做出.7z
比.rar
和LZMA2文件一般都比较小,我不明白为什么不能使用7-Zip.
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) 我想链接多个流操作(例如下载文件,动态解压缩,以及处理没有任何临时文件的数据).这些文件是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) 如何将这些设置转换为命令?
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小时.我查看了文档,但我无法理解.
我正在创建一个备份实用程序,用于压缩文本文件中列出的所有文件.我使用MS ACCESS作为我的前端和7-Zip进行压缩.这些是我正在使用的命令:
7zG.exe a c:\Backup\backup.zip
@c:\temp\tmpFileList.txt
Run Code Online (Sandbox Code Playgroud)
所有文件都在没有路径的情况下被压缩.有没有办法在zip文件中包含每个文件的路径?然后,当backup.zip
提取时,文件将恢复到其原始文件夹结构.
谢谢
我想使用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中保留文件夹结构时没问题).但是这次我需要的几个文件遍布整个地方......
我最近写了一个名为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在解压缩时会尝试这样做:
如果我想支持检查或从任意zip文件中提取并在没有EFS标志的情况下合理地尝试文件名编码,我还能找到什么?
我试图通过命令行使用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) 我使用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生成自解压档案?如果是这样,我应该使用哪些参数/命令行参数?提前致谢.
在powershell中使用7z解压缩文件的命令是什么?
set-alias sz "$env:ProgramFiles\7-Zip\7z.exe"
sz x $zipfilePath $destinationUnzipPath -aoa -r;
Run Code Online (Sandbox Code Playgroud)
该命令工作正常,但它说没有要处理的文件,一切正常而不是解压缩文件?
按照与本指南相同的步骤操作.我试图从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文件时,该过程如下所示:
7zip ×10
compression ×4
batch-file ×2
command-line ×2
zip ×2
.net ×1
archive ×1
cmd ×1
directory ×1
duplicates ×1
gzip ×1
jar ×1
permissions ×1
powershell ×1
sfx ×1
stream ×1
windows ×1
winrar ×1
winzip ×1
zipfile ×1