Длина блока C# не совпадает с его дополнением

Я застрял с этой ошибкой, и я не понимаю, почему. Можете ли вы помочь мне? Я пытаюсь редактировать файл PowerPoint на Sharepoint через клиентскую объектную модель и OpenXML. Редактирование работает нормально, но по какой-то причине меня бросают block length does not match with its complementОшибка. Я еще не нашел на Google ничего, что помогло.

Вот этот кодекс:

class Program
{
    // Credentials to log into the Sharepoint.
    private static NetworkCredential credential = new NetworkCredential("login", "pwd", "domain");
    static private void CopyStream(Stream source, Stream destination)
    {
        byte[] buffer = new byte[32768];
        int bytesRead;
        do
        {
            bytesRead = source.Read(buffer, 0, buffer.Length);
            destination.Write(buffer, 0, bytesRead);
        } while (bytesRead != 0);
    }

    static void Main(string[] args)
    {
        try
        {
            // Creating the Clientcontext
            ClientContext clientContext = new ClientContext("https://sharepoint.adress.com/folder/");
            clientContext.Credentials = credential;
            Web oWebsite = clientContext.Web;

            // Collect all lists from Sharepoint.
            ListCollection collList = oWebsite.Lists;
            clientContext.Load(collList);
            clientContext.ExecuteQuery();
            Console.WriteLine("Connected to Sharepoint.");

            // Getting the Presentation.
            Console.WriteLine("Working on " + filename + "..");
            Guid id = new Guid("2BBF9030-66C6-4F71-86E6-DFE41F57B9F3"); // List ID for the Slide Library.
            List sharedDocumentsList = clientContext.Web.Lists.GetById(id);
            CamlQuery camlQuery = new CamlQuery();
            String queryString = "<View><Query><Where><Eq><FieldRef Name='FileLeafRef'/><Value Type='Text'>" + filename + 
                "</Value></Eq></Where><RowLimit>1</RowLimit></Query></View>";    // FileLeafRef is the column "name" on the Sharepoint.
            camlQuery.ViewXml = @queryString;
            ListItemCollection listItems = sharedDocumentsList.GetItems(camlQuery);
            clientContext.Credentials = credential;
            clientContext.Load(sharedDocumentsList);
            clientContext.ExecuteQuery();

            clientContext.Credentials = credential;
            clientContext.Load(listItems);
            clientContext.ExecuteQuery();
            Console.WriteLine("Opened Document.");



            if (listItems.Count == 1)
            {
                ListItem item = listItems[0];
                clientContext.Credentials = credential;
                FileInformation fileInformation = ClientOM.File.OpenBinaryDirect(clientContext, (string)item["FileRef"]);

                using (MemoryStream memoryStream = new MemoryStream())
                {
                    CopyStream(fileInformation.Stream, memoryStream);

                    using (PresentationDocument ppt = PresentationDocument.Open(memoryStream, true))
                    {
                        string rId = GetSlidePart(ppt, slideNumber - 1);
                        PresentationPart pptPart = ppt.PresentationPart;
                        SlidePart slide = (SlidePart)pptPart.GetPartById(rId);
                        Boolean exists = false;

                        //groupExists(slide.Slide, "IDGroup", exists);

                        if (!groupExists(slide.Slide, "IDGroup", exists))
                        {
                            Console.WriteLine(exists);
                            Console.WriteLine("IDGroup not found in " + filename + ", adding it..");
                            EditPresentation(memoryStream, clientContext, item);
                        }
                        else
                        {
                            Console.WriteLine(exists);
                            Console.WriteLine("IDGroup already exists, skipping Presentation..");
                        }
                    } // Error gets thrown here.
                }
            }
            else
            {
                Console.WriteLine("Document not found.");
            }
            Console.WriteLine("Done.");
            Console.Read();
        }
        catch (Exception ex) when (ex is ServerException || ex is InvalidCastException || ex is OpenXmlPackageException || ex is WebException)
        {

            Console.WriteLine(ex.ToString());
            Console.Read();

        }
}

И это метод, который редактирует файл. Обрезанный до частей, где я использую memoryStream, полный код можно посмотреть на pastebin:

public static void EditPresentation(MemoryStream memoryStream, ClientContext clientContext, ListItem item)
{
    using (PresentationDocument ppt = PresentationDocument.Open(memoryStream, true))
    {
        string rId = GetSlidePart(ppt, slideNumber - 1);
        PresentationPart pptPart = ppt.PresentationPart;
        SlidePart slide = (SlidePart)pptPart.GetPartById(rId);
        ShapeTree tree = new ShapeTree();
        CommonSlideData commonSlideData1 = new CommonSlideData();

        // 250 Lines of OpenXML go here.

        slide.AddHyperlinkRelationship(new System.Uri(adress, System.UriKind.Absolute), true, "rId99");
        slide.Slide.CommonSlideData.ShapeTree.Append(groupShape1);
        slide.Slide.Save();
        pptPart.Presentation.Save();
    }

    memoryStream.Seek(0, SeekOrigin.Begin);
    ClientOM.File.SaveBinaryDirect(clientContext, (string)item["FileRef"], memoryStream, true);
}

Есть что-то фундаментальное, что я делаю не так? Я никогда не делал ничего подобного, и, как всегда, все предложения по улучшению будут оценены.

0 ответов

Другие вопросы по тегам