我们有一个生成文档的应用程序。 为了帮助我们完成此过程,我们使用了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秒之间保存该文档会导致两个不同的字节数组具有完全相同的内容。
答案 0 :(得分:1)
流之间的差异与时间无关。保存文件时就是生成的关系ID。
我运行了两次程序,并在第二次运行之前重命名了保存的文件。
然后,我使用OpenXML Productivity Tool对文件进行了比较,它显示的唯一区别是文档_rels部分中的关系ID。
_rels部分是OpenXML文件的关系部分。它是存储对文档其他部分的引用的中心位置。免费电子书OpenXML Explained中进一步解释了Rels。