解压缩 docx 文件,比较其内容并创建新的合并 docx 文件
本文关键字:文件 docx 创建 合并 比较 解压缩 | 更新日期: 2023-09-27 17:56:29
为什么用ZipFile.CreateFromDirectory
重新压缩的docx与原始的不一样?
我正在构建一个用于"docx"(和其他 word 文档)比较的模块。首先,我解压缩两个"docx"文件。然后,我比较并合并文档解压缩后创建的目录结构中的xml文件。最后,我压缩合并的目录并创建新的"docx"文件。根据单词比较,两个"docx"文件(原始文件和合并文件)Microsoft相同。此外,根据CRC32比较,xml内容是相同的,但合并的"docx"文件的大小或CRC32值与原始文件不同。对于减压,我使用系统.IO.压缩库。
这是压缩问题吗?Microsoft Word(和其他查看器)用于创建开放 xml 格式文档(如"docx"文件)的压缩算法是什么?
我运行了一些单元技术进行几个docx比较。所以我认为检查测试是否正确通过的唯一方法是比较 crc32 数字。
public static void CreateCompressFile(string dirinfo, string originalFile)
{
FileInfo fi = new FileInfo(originalFile);
ZipFile.CreateFromDirectory(dirinfo,
originalFile.Replace(fi.Extension, "_tmp" + fi.Extension),
CompressionLevel.Fastest, false);
}
Docx 是 ZIP 文件。只要解压缩的内容相同,从 Word 的角度来看,就可以认为文件相同(除非您出于某种原因需要对 ZIP 文件本身进行签名)。
ZIP 文件格式不需要压缩数据的某些特定格式 - 它明确允许压缩质量的变化。每个压缩库/工具都可以根据其内部标准自由选择压缩级别。即使传递给压缩的选项相似,2 个不同的实现也不太可能从相同的内容生成相同的 ZIP 文件。
即,即使您拥有的样本也显示能够选择压缩级别:ZipFile.CreateFromDirectory(...,CompressionLevel.Fastest, ...);
。
之前在 SE 上讨论过的类似问题:使用 GUI 创建的 ZIP 文件比在 shell 中创建的 ZIP 文件具有更多的字节数。