При сохранении клона WordprocessingDocument каждый раз создается новый байтовый массив - PullRequest
0 голосов
/ 17 апреля 2019

У нас есть приложение, которое генерирует документы.Чтобы помочь нам в этом процессе, мы используем 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 Ответ

1 голос
/ 19 апреля 2019

Разница между потоками не связана со временем. Это идентификатор отношения, который создается при сохранении файлов.

Я дважды запустил вашу программу и переименовал сохраненный файл перед вторым запуском.

Затем я сравнил файлы с помощью OpenXML Productivity Tool , и единственное отличие, которое он показал, - это идентификатор отношения в части _rels документа.

enter image description here

Часть _rels является частью отношений файла OpenXML. Это центральное место, где хранятся ссылки на другие части документа. Rels объясняется далее в бесплатной электронной книге OpenXML Explained .

...