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 :)