我正在尝试使用SharePoint 2010的新SharePoint客户端对象模型(COM)获取一些基本文件版本信息。我已成功加载并查询了我的ListItem,File和FileVersionCollection,如下所示:
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();
此时,我可以遍历listItem.File.Versions
集合并获取VersionLabel
和Url
。但是,我需要获取版本的字节数,而FileVersion
对象缺少Size
或Length
属性。
我决定只能从服务器上读取版本并丢弃字节(我知道效率不高,但应该工作),如下所示:
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
}
但每次执行File.OpenBinaryDirect
时都会收到此错误:
Specified argument was out of the range of valid values. Parameter name: serverRelativeUrl
如果我取值version.Url
并将其放入浏览器,则会打开文件。
有关如何获取文件大小的任何建议?我宁愿不打开HTTP流并读取文件,但如果涉及到,那么我会。
顺便说一句,我尝试创建一个新的标签sharepoint-com,但我没有足够的声誉。如果有足够积分的人认为标签是值得的,请创建它:)答案 0 :(得分:1)
SPFile.Length
获取文件的大小(以字节为单位),不包括文件中使用的任何Web部件的大小。
答案 1 :(得分:0)
显然,您无法通过File.OpenBinaryDirect访问以前版本的内容。您可以使用WebClient直接通过HTTP / S下载它。
Web web = ...;
FileVersion version = ...;
using (var input = new WebClient() { UseDefaultCredentials = true }) {
string url = web.Url + "/" + version.Url;
byte[] content = input.DownloadData(url);
}