SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Dokumente einer Dok-Bib in die Dok-Bib einer Subsite

Unbeantwortet Dieser Beitrag hat 2 Antworten

Ohne Rang
54 Beiträge
DDG erstellt 26 Sept. 2012 14:28
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen,

ich möchte folgendes Szenario progammatisch lösen. In einer Dokumentenbibliothek ("Quelle") werden Dokumente mit von verschiedenen Typen gepflegt. Sobald ein Dokument hinzugefügt wurde, soll ein Event-Receiver das hinzugefügte Dokument kopieren und in die Dok-Bib ("Ziel") einer Subsite adden. Ich habe dazu ein Stück Code in Visual Studio 2010 Premium mit dem Microsoft .NET Framework Versoin 4.0.30319 mit der SPrache c# geschrieben. Dabei wird der Quellliste geholt und alle item durchlaufen und es soll jedes Item in die Zielliste kopiert werden.

Problem: Beim debuggen wird jedes mal bei der Methode OpenBinary(); geworfen. Ich habe schon versucht Öffnungsfunktionen hinzuzufügen (wie in dem Kommentar zu sehen) oder die Version OpenBinaryStream(); zu nutzen aber es hilft leider nichts. Hier ist mal der Codesnippet und die Fehlermeldung.

 public override void ItemAdded(SPItemEventProperties properties){

 

 

if (properties.ListTitle == "Quelle"){

 

 

SPWeb pSite = properties.OpenWeb();

 

 

SPList list = pSite.Lists["Quelle"];

 

 

SPListItemCollection listItems = list.Items;

 

 

foreach (SPListItem item in listItems){

 

 

SPFile sourceFile = pSite.GetFile(item.Name);

 

 

SPFileVersionCollection versions = sourceFile.Versions;

 

 

int versionInt = versions.Count;

 

 

byte[] str;

 

 

if (versionInt == 0){

str = sourceFile.OpenBinary();

 

//OpenBinary(SPOpenBinaryOptions.None)

 

 

 

 

 

 

 

 

 

 

 

}

 

 

else{

 

 

 

SPFileVersion version = versions[versionInt]; using (SPWeb websub = pSite.Webs["Projekte"]){

 

 

SPDocumentLibrary docLib = websub.Lists["Ziel"] as SPDocumentLibrary;

str = version.File.OpenBinary();

}

 

 

docLib.RootFolder.Files.Add(sourceFile.Name, str);

}...

Ich kann leider keine Bilder hochladen. Deswegen beschreibe ich den Fehler textuell.

Es wir eine SPException geworfen mit der Fehlermeldung (Kann Datei "Dateiname.docx" nicht öffnen).

{"<nativehr>0x81070211</nativehr><nativestack></nativestack>Kann Datei \"Angebotsvorlage.docx\" nicht öffnen."}

Data: {System.Collections.ListDictionaryInternal}

Name: HandleComException

Ich würde mich freuen wenn ihr mir helfen könnt.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Sept. 2012 17:12
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Zunächst mal: würdest Du bitte Quellcode aus Visual Studio zuerst in Notepad oder einen anderen Texteditor kopieren, dort wieder ausschneiden und dann hier einfügen? Danke. Man kann es dann einfach besser lesen.

[quote user="DDG"]int versionInt = versions.Count;[/quote]
[quote user="DDG"]SPFileVersion version = versions[versionInt]; [/quote]

Du solltest Dir genauer anschauen, wie Arrays und Collections in C# funktionieren. Versions.Count liefert Dir z.B. die Zahl 2. Das heißt es gibt zwei Versionen und die haben dann die Indizes null und eins. Ein Zugriff mit versions[2] liefert also nichts brauchbares (oder gar einen Fehler). Verwende hier einfach Versions[versionInt-1]

Dann noch eine Frage: warum gehst Du in einem SPItemEventReceiver, der ja für genau ein Element ausgelöst wird, alle Elemente der Liste durch und machst etwas damit? Ein SPItemEventReceiver sollte eigentlich nur das Element behandeln, für das er gerufen wird. Um eine Liste durchzugehen, gibt es bessere Möglichkeiten. Zumindest meiner Meinung nach :-)

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
54 Beiträge
DDG Als Antwort am 27 Sept. 2012 09:26
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Erstmal dankeschön für deine Antwort. Ok das mit Nodepad werde ich mir für das nächste mal merken. Dies war mein erster Beitrag und ich habe den Text eigentlich bei der Eingabe formatiert und mich gewundert warum er so angezeigt wurde. Inzwischen ist der Beitrag auch dreimal gepostet, da bei mir der IE ein bisschen hing und anscheind doch die davor gedrückten Absendeversuche angenommen hat :-). Ich habe bei den anderen Beiträgen zwar auf löschen gedrückt aber sie sind nach wie vor vorhanden.

Danke für den Tipp mit den Versionen. Achso den Fehler warum es mit dem OpenBinary() nicht geklappt hat lag einfach daran, dass ich den Filenamen (GetFile(item.Name) ) angegeben habe anstatt die Url. Ja das durchlaufen aller Dokumente macht in diesem Zusammenhang keinen Sinn nur werde ich das CodeSnippet in einer anderen Anwendung benötigen und es war sozusagen ein Testprogramm.