SharePoint附带属性字段文件迁移客户端模型
1.说明
.Net客户端对象模型(OM)是Microsoft SharePoint 2010软件开发工具包(SDK)的三个新客户端API之一,允许与SharePoint网站进行交互,用于与来自远程客户端或服务器的SharePoint数据进行互操作。
2.附带属性字段的文件迁移代码编写
下面通过编写一个方法来完成一次附带属性字段的文件迁移。
方法解读
输入参数:
原文件网站地址,原文件文件库表,文件名,转存网站地址,转存库表对应的路径名,是否删除原文件
过程:
1.创建客户端模型,包括模型两次实例化ClientContext(原文件网站和迁移文件网站),需要分别信息验证Credentials(对象不同);
2.打开原文件库表,使用CAML语法,根据文件名进行查找,语法中注意View Scope='RecursiveAll’的使用;
3.载入目标文件库表,原文件网站ClientContext对象使用OpenBinaryDirect获取文件流,构建迁移地址(使用到转存库表对应的路径名),迁移网站ClientContext根据文件流,迁移地址,使用SaveBinaryDirect迁移文件;
4.原网站文件库列项属性字段赋值给目标网站的相应字段;
5.删除原文件,迁移步骤完成。
/// <summary>
/// 文件转存
/// </summary>
/// <param name="srcUrl">原文件地址</param>
/// <param name="destUrl">转存地址</param>
/// <param name="srcLibrary">原文件库表</param>
/// <param name="destLibrary">转存库表对应的路径名</param>
/// <param name="FileName">文件名</param>
/// <param name="isDeleteFile">是否删除源文件</param>
public static void CopyDocuments(string srcUrl, string srcLibrary, string FileName, string destUrl, string destLibrary, bool isDeleteFile)
{
// set up the source context
ClientContext srcContext = new ClientContext(srcUrl);
srcContext.Credentials = new NetworkCredential("域账号", "域账号密码", "域名");
// set up the destination context
ClientContext destContext = new ClientContext(destUrl);
destContext.Credentials = new NetworkCredential("域账号", "域账号密码", "域名");
// get the source list and items
Web srcWeb = srcContext.Web;
List srcList = srcWeb.Lists.GetByTitle(srcLibrary);
ListItemCollectionPosition itemPosition = null;
while (true)
{
CamlQuery camlQuery = new CamlQuery();
camlQuery.ListItemCollectionPosition = itemPosition;
//View Scope='RecursiveAll'使得文档列表中所有文件都遍历一次,无论路径如何
camlQuery.ViewXml =
@"<View Scope='RecursiveAll'>
<Query>
<Where>
<Eq>
<FieldRef Name='FileLeafRef'/>
<Value Type='text'>" + FileName + @"</Value>
</Eq>
</Where>
<RowLimit>1</RowLimit>
</Query>
</View>";
ListItemCollection col = srcList.GetItems(camlQuery);
srcContext.Load(col);
srcContext.ExecuteQuery();
itemPosition = col.ListItemCollectionPosition;
// get the target list
Web destWeb = destContext.Web;
destContext.Load(destWeb);
destContext.ExecuteQuery();
//Console.ReadLine();
foreach (var doc in col)
{
try
{
Microsoft.SharePoint.Client.File f = doc.File;
srcContext.Load(f);
srcContext.ExecuteQuery();
ListItem item = (ListItem)doc;
string strPath = destWeb.ServerRelativeUrl.TrimEnd('/') + "/" + destLibrary + "/" + f.Name;
FileInformation fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(srcContext, f.ServerRelativeUrl);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(destContext, strPath, fileInfo.Stream, true);
Microsoft.SharePoint.Client.File file = destWeb.GetFileByServerRelativeUrl(strPath);
ListItem lstItem = file.ListItemAllFields;
destContext.Load(lstItem);
destContext.ExecuteQuery();
//属性字段赋值
lstItem["目标属性字段"] = item["原属性字段"];
lstItem.Update();
destContext.ExecuteQuery();
Console.WriteLine("转存成功!");
//原文档删除
if (isDeleteFile)
{
item.DeleteObject();
srcContext.ExecuteQuery();
Console.WriteLine("原文件删除成功!");
}
}
catch (Exception ex)
{
Console.WriteLine("File Error = " + ex.ToString());
Console.ReadLine();
}
}
if (itemPosition == null)
break;
}
}
参考
以上为个人整理总结的知识,如有遗漏或错误欢迎留言指出、点评,如要引用,请写引用说明,谢谢。
[1]: https://social.technet.microsoft.com/Forums/en-US/579bf31a-acfc-4f86-9e7f-2cb3502879e7/copy-and-move-files-from-one-library-to-another-library-along-with-metadata-values-using-client?forum=sharepointdevelopmentprevious