每次保存 WordprocessingDocument 的克隆都会生成不同的字节数组

Saving a clone of WordprocessingDocument generates different byte array every time

我们有一个生成文档的应用程序。 为了帮助我们完成这个过程,我们使用 OpenXml。

出于单元测试的目的,我们想看看生成的文档是否与我们期望的文档相同。

但是这样:

public byte[] Save()
{
    using (var memoryStream = new MemoryStream())
    {
        _wordprocessingDocument.Clone(memoryStream);
        return memoryStream.ToArray();
    }
}

returns 每次调用的字节数组都不一样

我真的不明白为什么。

我将其中两个不同的字节数组保存到磁盘并将扩展名更改为 .zip。

zip 中的所有文件都具有相同的内容。

欢迎任何关于为什么字节数组不完全相同的指示!

更新

一定是跟时间有关。 以下代码在控制台应用程序中显示 "false"。 如果删除 Thread.Sleep() 它 returns "true".

 class Program
    {
        static void Main(string[] args)
        {
            using (var document = WordprocessingDocument.Create("c:\Test.docx", WordprocessingDocumentType.Document))
            {
                document.AddMainDocumentPart();
                document.MainDocumentPart.Document = new Document();
                document.MainDocumentPart.Document.Body = new Body();
                document.MainDocumentPart.Document.Body.AppendChild(new Paragraph());

                var firstClone = Save(document);
                File.WriteAllBytes("D:\Test1.docx", firstClone);

                Thread.Sleep(5000);

                var secondClone = Save(document);
                File.WriteAllBytes("D:\Test2.docx", secondClone);

                Console.WriteLine(firstClone.SequenceEqual(secondClone));
                Console.ReadLine();
            }
        }

        private static byte[] Save(WordprocessingDocument wordprocessingDocument)
        {
            using (var memoryStream = new MemoryStream())
            {
                wordprocessingDocument.Clone(memoryStream);
                return memoryStream.ToArray();
            }
        }
    }

解决方法

在我的单元测试中,我目前正在比较两个文档的 FlatOpcString。因为内容是相同的,这就是我要测试的内容。 但这里的问题仍然是一样的。为什么以 5 秒间隔保存此文档会导致两个内容完全相同的不同字节数组。

流之间的差异与时间无关。保存文件时生成的关系id。

我运行你的程序两次,并在第二次运行之前重命名了保存的文件。

然后我使用 比较文件,它显示的唯一区别是文档的 _rels 部分中的关系 ID。

_rels 部分是 OpenXML 文件的关系部分。它是存储对文档其他部分的引用的中心位置。在免费电子书 OpenXML Explained.

中进一步解释了 Rels