每次保存WordprocessingDocument的副本时,每次都会生成不同的字节数组

时间:2019-04-17 14:51:28

标签: c# openxml openxml-sdk

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

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

但这是

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

每次调用它都会返回一个不同的字节数组。

我真不明白为什么。

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

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

关于字节数组为何不完全相同的任何指针都是最欢迎的!

更新

必须与时间相关。 以下代码在控制台应用程序中显示“ false”。 如果删除Thread.Sleep(),它将返回“ 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();
            }
        }
    }

WORKAROUND

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

1 个答案:

答案 0 :(得分:1)

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

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

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

enter image description here

_rels部分是OpenXML文件的关系部分。它是存储对文档其他部分的引用的中心位置。免费电子书OpenXML Explained中进一步解释了Rels。