每次保存 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
我们有一个生成文档的应用程序。 为了帮助我们完成这个过程,我们使用 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 部分是 OpenXML 文件的关系部分。它是存储对文档其他部分的引用的中心位置。在免费电子书 OpenXML Explained.
中进一步解释了 Rels