views:

28

answers:

1

I am trying to get some basic file version information using the new SharePoint Client Object Model (COM) with SharePoint 2010. I have successfully loaded and queried for my ListItem, File, and FileVersionCollection like this:

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();

At this point, I can iterate through the listItem.File.Versions collection and get the VersionLabel and Url. However, I need to get the number of bytes of the version and the FileVersion object is lacking a Size or Length property.

I decided I could just read the version off the server and throw away the bytes (not efficient, I know, but it should work) like so:

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
}

But every time I execute File.OpenBinaryDirect I get this error:

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

If I take the value of version.Url and put it into my browser, the file opens.

Any suggestions on how to get the file size? I would prefer not to open an HTTP stream and read the file, but if it comes to that, then I will.

BTW, I tried creating a new tag sharepoint-com but I don't have enough reputation. If someone with enough points thinks that tag is worthwhile, please create it :)

A: 

listItem["_ModerationStatus"] = 0; listItem["PublishedDate"] = System.DateTime.Now;

Maggie