2010-08-31 9 views
1

J'essaie d'obtenir des informations de base sur la version de fichier à l'aide du nouveau modèle d'objet client SharePoint (COM) avec SharePoint 2010. J'ai chargé et interrogé avec succès mes éléments ListItem, File et FileVersionCollection comme ceci:Informations sur la version du fichier COM (SharePoint Client Object Model)

using (ClientContext context = new ClientContext(site)) { 
    context.Load(context.Web); 
    List docs = context.Web.Lists.GetByTitle("Docs"); 
    context.Load(docs); 
    //query that returns the ListItems I want 
    CamlQuery query = new CamlQuery { ViewXml = ".."}; 

    ListItemCollection docItems = docs.GetItems(query); 
    context.Load(docItems); 
    context.ExecuteQuery(); 

    //load the FileVersionCollection 
    foreach (ListItem listItem in docItems) { 
     context.Load(listItem); 
     context.Load(listItem.File); 
     context.Load(listItem.File.Versions); 
    } 
    context.ExecuteQuery(); 

À ce stade, je peux parcourir la collection listItem.File.Versions et obtenir le VersionLabel et Url. Cependant, j'ai besoin d'obtenir le nombre d'octets de la version et l'objet FileVersion manque d'une propriété Size ou Length.

j'ai décidé que je pouvais lire la version le serveur et jeter les octets (pas efficace, je sais, mais il devrait travail) comme ceci:

foreach (FileVersion version in item.File.Versions) { 
    FileInformation info = File.OpenBinaryDirect(context, version.Url); 

    long filesize = 0; 

    Stream stream = info.Stream; 
    byte[] buffer = new byte[4096]; 
    int read = 0; 
    while ((read = stream.Read(buffer, 0, 4096)) > 0) { 
     filesize += read; 
    } 

    //use the filesize 
} 

Mais chaque fois que j'exécute File.OpenBinaryDirect Je reçois cette erreur:

 
Specified argument was out of the range of valid values. 
Parameter name: serverRelativeUrl 

Si je prends la valeur de version.Url et de le mettre dans mon navigateur, le fichier s'ouvre.

Des suggestions sur la façon d'obtenir la taille du fichier? Je préférerais ne pas ouvrir un flux HTTP et lire le fichier, mais s'il le faut, alors je le ferai. Par ailleurs, j'ai essayé de créer un nouveau tag sharepoint-com mais je n'ai pas assez de réputation. Si une personne disposant de suffisamment de points pense que cette balise vaut la peine, créez-la :)

Répondre

1

SPFile.Length Obtient la taille du fichier en octets, à l'exclusion de la taille des composants WebPart utilisés dans le fichier.

+1

Pas pour le modèle d'objet client ... –

0

Apparemment, vous ne pouvez pas accéder au contenu des versions précédentes par File.OpenBinaryDirect. Vous pouvez utiliser WebClient pour le télécharger directement via HTTP/S.

Web web = ...; 
FileVersion version = ...; 
using (var input = new WebClient() { UseDefaultCredentials = true }) { 
    string url = web.Url + "/" + version.Url; 
    byte[] content = input.DownloadData(url); 
} 

Voir this forum thread à ce sujet.

Questions connexes