1

我正在尝试使用带有 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集合并获取VersionLabeland Url。但是,我需要获取版本的字节数,并且该FileVersion对象缺少SizeorLength属性。

我决定我可以从服务器读取版本并丢弃字节(效率不高,我知道,但它应该可以工作),如下所示:

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我都会收到这个错误:

指定的参数超出了有效值的范围。
参数名称:serverRelativeUrl

如果我取 的值version.Url并将其放入浏览器中,文件就会打开。

关于如何获取文件大小的任何建议?我宁愿不打开 HTTP 流并读取文件,但如果涉及到,我会的。

顺便说一句,我尝试创建一个新标签 sharepoint-com,但我没有足够的声誉。如果有足够积分的人认为该标签值得,请创建它:)

4

2 回答 2

1

SPFile.Length获取文件的大小(以字节为单位),不包括文件中使用的任何 Web 部件的大小。

于 2011-03-24T17:44:01.647 回答
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);
}

请参阅此论坛主题

于 2012-09-10T18:42:39.900 回答