我在SharePoint中有一个文档库。当一个新文件上传到该库时,我希望它也能自动复制到另一个文档库。我怎么能这样做?
答案 0 :(得分:14)
使用项目事件接收器并覆盖ItemAdded事件。 SPItemEventProperties将通过ListItem属性为您提供对列表项的引用。
有两种方法可以做到这一点(感谢你发现了CopyTo)。
方法1:使用CopyTo
此方法将任何列表项及其关联的文件和属性复制到同一网站集中的任何位置(可能还有其他Web应用程序,但我还没有测试过)。如果您查看项目的属性或使用其下拉菜单,SharePoint还会自动维护指向源项目的链接。可以使用UnlinkFromCopySource删除此链接。
CopyTo的唯一技巧是目标位置需要完整的URL。
public class EventReceiverTest : SPItemEventReceiver
{
public override void ItemAdded(SPItemEventProperties properties)
{
properties.ListItem.CopyTo(
properties.WebUrl + "/Destination/" + properties.ListItem.File.Name);
}
}
方法2:流式复制,手动设置属性
只有在需要更多控制复制哪些项属性或者需要更改文件内容时,才需要使用此方法。
public class EventReceiverTest : SPItemEventReceiver
{
public override void ItemAdded(SPItemEventProperties properties)
{
SPFile sourceFile = properties.ListItem.File;
SPFile destFile;
// Copy file from source library to destination
using (Stream stream = sourceFile.OpenBinaryStream())
{
SPDocumentLibrary destLib =
(SPDocumentLibrary) properties.ListItem.Web.Lists["Destination"];
destFile = destLib.RootFolder.Files.Add(sourceFile.Name, stream);
stream.Close();
}
// Update item properties
SPListItem destItem = destFile.Item;
SPListItem sourceItem = sourceFile.Item;
destItem["Title"] = sourceItem["Title"];
//...
//... destItem["FieldX"] = sourceItem["FieldX"];
//...
destItem.UpdateOverwriteVersion();
}
}
<强>部署强>
您也有各种部署选项。您可以将事件接收器与连接到内容类型或列表的功能相关联,然后以编程方式添加它们。有关详细信息,请参阅this article at SharePointDevWiki。