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

问题描述 投票:0回答:1

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

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

但是这个:

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

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

我真的不明白为什么。

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

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

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

UPDATE

它必须与时间有关。以下代码在控制台应用程序中显示“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();
            }
        }
    }

替代方法

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

c# openxml openxml-sdk
1个回答
1
投票

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

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

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

enter image description here

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

© www.soinside.com 2019 - 2024. All rights reserved.