Laden...

Nach Dateizugriff auf eine Datei im Sharepoint ist diese nicht mehr lesbar

Erstellt von not_a_table vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.677 Views
N
not_a_table Themenstarter:in
3 Beiträge seit 2016
vor 7 Jahren
Nach Dateizugriff auf eine Datei im Sharepoint ist diese nicht mehr lesbar

Hallo zusammen,

zum ersten mal programmiere ich etwas, das auf einen Sharepoint zugreift. Grob umschrieben möchte ich per C# auf eine Powerpoint Datei zugreifen, die auf dem Server liegt und innterhalb dieser Datei eine Folie verändern.
Da ich wie gesagt noch nice etwas in diese Richtung umgesetzt habe, wollte ich zunächst damit anfangen einfach eine Date zu öffnen und diese danach wieder zu schließen. Mein Problem ist jedoch, dass die Datei, die ich aufrufe, nach dem Programmablauf nicht mehr lesbar ist. Ich wollte euch fragen, ob vielleicht jemand den Fehler sieht, und mir zeigen kann, was ich falsch mache?

Hier mein bisheriger Code:

class Program
{

    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
        {
            ClientContext clientContext =
                new ClientContext("https://sharepoint.adresse.com/ordner/");
            clientContext.Credentials = credential;

            Web oWebsite = clientContext.Web;
            ListCollection collList = oWebsite.Lists;

            clientContext.Load(collList);
            clientContext.ExecuteQuery();
            Console.WriteLine("Opened Sharepoint.");

            Guid id = new Guid("2BBF9030-66C6-4F71-86E6-DFE41F57B9F3");
            List sharedDocumentsList = clientContext.Web.Lists.GetById(id);
            CamlQuery camlQuery = new CamlQuery();
            camlQuery.ViewXml =
                @"<View>
                <Query>
                  <Where>
                    <Eq>
                      <FieldRef Name='FileLeafRef'/>
                      <Value Type='Text'>TestSlide.pptx</Value>
                    </Eq>
                  </Where>
                  <RowLimit>1</RowLimit>
                </Query>
              </View>";
            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))
                    {                    }
                    ClientOM.File.SaveBinaryDirect(clientContext, (string)item["FileRef"], memoryStream, true);
                }
            }
            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();

        }
    }
}

16.842 Beiträge seit 2008
vor 7 Jahren

Das CopyStream kannst Du Dir sparen. Ohnehin wäre ein while() besser als ein do-while in diesem Fall (Du würdest auch versuchen zu schreiben, wenn es nichts mehr zu lesen gibt).
Stream selbst hat eine Methode CopyTo, die Du hier verwenden kannst.

Ansonsten; hast Du mal die Files verglichen, ob dort irgendetwas auffällig ist?
Auch wenn es nur kryptische Zeichen sind, sieht man ja, ob es ähnlich aussieht.

Ist das Lesen oder das Schreiben das Problem?
Les also erstmal die Datei von Sharepoint und schreib sie lokal. Geht es?
Führ Deine Schreib-Methode ebenfalls mal gegen lokal aus und schau, ob es daran liegt.
Dann weißt Du, bei welchem Step Du schauen musst.

N
not_a_table Themenstarter:in
3 Beiträge seit 2016
vor 7 Jahren

Hallo Abt,

wenn ich copyStream auskommentiere wird mir eine > Fehlermeldung:

OpenXmlPackageException: the specific package is Invalid. The main part is missing. Woran könnte das liegen?

Die Dateien zu vergleichen ist schwierig, da ich die Datei nach dem Programmdurchlauf überhaupt nicht mehr öffnen kann. Ich bekomme von Powerpoint dann nur noch die Information:

Fehlermeldung:
PowerPoint found a problem with content in [path-to-file].\TestSlide.pptx. PowerPoin can attempt to repair the presentation.

Das reparieren bringt allerdings nichts.

Das schreiben scheint das Problem zu sein, wenn ich die Zeile

ClientOM.File.SaveBinaryDirect(clientContext, (string)item["FileRef"], memoryStream, true);

auslasse, habe ich kein Problem mit der Datei.

N
not_a_table Themenstarter:in
3 Beiträge seit 2016
vor 7 Jahren

Ich habe meinen Fehler gefunden. Ich musste vor dem

SaveBinaryDirect

noch den Anfang des Streams suchen. Wenn man den Code so abändert funktionierts:

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