我正在制作一种工具,将特定内容(列表项目和文档)从农场迁移/更新到另一个。有点像 SharePoint内容部署向导, ,但具有我客户的自定义规格。

使用内容部署API似乎很好 主意.

每个农场中的站点收集都是使用标准过程(使用自定义站点定义供应列表和ELT)创建的。我认为我不应该使用”保留对象“因为两个农场之间的GUID不同。

当我导出/导入数据时:

  • 文档已正确添加/更新,但列表项目并非如此:
  • 它不会更新现有列表项目。它总是添加新的。

因此,这是我的问题:更新现有列表项目的最佳解决方案是什么(它们之间没有相同的指导)?我想保留ListItem.ID(不是唯一的)。那可能吗 ?是否有解决方案告诉API将此项目还原到该项目?在最坏的情况下,我可以在导入之前删除现有项目,但是这些项目将失去其原始的ListItem.ID(INT)...

或者我可以忘记内容部署API ...

下图:我正在使用的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint.Deployment;
using Microsoft.SharePoint;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
        Export();
        Import();
    }

    static void Import()
    {
        using (SPSite site = new SPSite("http://localhost:5555/sites/aa/"))
        {
            using (SPWeb web = site.OpenWeb())
            {
                SPImportSettings settings = new SPImportSettings();
                settings.SiteUrl = site.Url;
                settings.FileLocation = @"c:\export";
                settings.BaseFileName = "blop.cmp";
                settings.RetainObjectIdentity = false;
                settings.CommandLineVerbose = true;

                SPImport import = new SPImport(settings);
                import.Run();  
            }
        }
    }


    static void Export()
    {
        using (SPSite site = new SPSite("http://localhost:5555"))
        {
            using (SPWeb web = site.OpenWeb())
            {
                SPList listDocs = web.Lists["Shared Documents"];
                SPListItem item = listDocs.Items[0];
                SPExportObject obj = new SPExportObject();
                obj.Id = item.UniqueId;
                obj.Type = SPDeploymentObjectType.ListItem;

                SPList listTasks = web.Lists["Tasks"];
                SPListItem item2 = listTasks.Items[0];
                SPExportObject obj2 = new SPExportObject();
                obj2.Id = item2.UniqueId;
                obj2.Type = SPDeploymentObjectType.ListItem;


                SPExportSettings settings = new SPExportSettings();
                settings.IncludeVersions = SPIncludeVersions.LastMajor;
                settings.SiteUrl = site.Url;
                settings.IncludeSecurity = SPIncludeSecurity.None;
                settings.FileLocation = "C:\\export";
                settings.BaseFileName = "blop";
                settings.CommandLineVerbose = true;
                settings.ExportObjects.Add(obj);
                settings.ExportObjects.Add(obj2);
                settings.OverwriteExistingDataFile = true;

                SPExport export = new SPExport(settings);
                export.Run();

            }
        }
    }
  }
}
有帮助吗?

解决方案

我找到了一个解决方案:

微软让我们修改 XML文件 用于导入数据:

Screenshot temp folder

所以我做了什么:

  • 将导入设置设置为true。
  • 修改XML文件以更改现有内容的指南

现在,有很多硬编码的东西,但是我认为,我将能够使其更通用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint.Deployment;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
using System.IO;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
        Export();
        Import();
    }

    static void Import()
    {
        using (SPSite site = new SPSite("http://localhost:5555/sites/aa"))
        {
            using (SPWeb web = site.OpenWeb())
            {
                SPImportSettings settings = new SPImportSettings();
                settings.SiteUrl = site.Url;
                settings.FileLocation = @"c:\export";
                settings.BaseFileName = "blop.cmp";
                settings.RetainObjectIdentity = true;

                settings.CommandLineVerbose = true;

                SPImport import = new SPImport(settings);
                import.Started += new EventHandler<SPDeploymentEventArgs>(import_Started);
                import.Run();  
            }
        }
    }

    static void import_Started(object sender, SPDeploymentEventArgs e)
    {
        Guid IDListOld = Guid.Empty;
        Guid IDItemOld = Guid.Empty;
        Guid IDWebOld = Guid.Empty;
        Guid IDRootFolderOld = Guid.Empty;
        Guid IDFolderTaskOld = Guid.Empty;
        string IDCtypeOld = "";

        Guid IDListNew = Guid.Empty;
        Guid IDItemNew = Guid.Empty;
        Guid IDWebNew = Guid.Empty;
        Guid IDRootFolderNew = Guid.Empty;
        Guid IDFolderTaskNew = Guid.Empty;
        string IDCtypeNew = "";

        using (SPSite site = new SPSite("http://localhost:5555"))
        {
            using (SPWeb web = site.OpenWeb())
            {
                SPList list = web.Lists["Tasks"];
                IDWebOld = web.ID;
                IDListOld = list.ID;
                IDItemOld = list.Items[0].UniqueId;
                IDCtypeOld = list.Items[0].ContentType.Id.ToString();
                IDRootFolderOld = list.RootFolder.UniqueId;
                IDFolderTaskOld = web.GetFolder("Lists/Tasks/Task").UniqueId;
            }
        }

        using (SPSite site = new SPSite("http://localhost:5555/sites/aa/"))
        {
            using (SPWeb web = site.OpenWeb())
            {
                SPList list = web.Lists["Tasks"];
                IDWebNew = web.ID;
                IDListNew = list.ID;
                IDItemNew= list.Items[0].UniqueId;
                IDCtypeNew = list.Items[0].ContentType.Id.ToString();
                IDRootFolderNew = list.RootFolder.UniqueId;
                IDFolderTaskNew = web.GetFolder("Lists/Tasks/Task").UniqueId;
            }
        }

        DirectoryInfo d = new DirectoryInfo(e.TempDirectoryPath);
        foreach (FileInfo info in d.GetFiles())
        {
            string content = "";
            using (TextReader reader = File.OpenText(info.FullName))
            {
                content = reader.ReadToEnd();
                content = content.Replace(IDItemOld.ToString(), IDItemNew.ToString());
                content = content.Replace(IDWebOld.ToString(), IDWebNew.ToString());
                content = content.Replace(IDListOld.ToString(), IDListNew.ToString());
                content = content.Replace(IDCtypeOld.ToString(), IDCtypeNew.ToString());
                content = content.Replace(IDRootFolderOld.ToString(), IDRootFolderNew.ToString());
                content = content.Replace(IDFolderTaskOld.ToString(), IDFolderTaskNew.ToString());
            }
            File.WriteAllText(info.FullName, content);

        }
    }


    static void Export()
    {
        using (SPSite site = new SPSite("http://localhost:5555"))
        {
            using (SPWeb web = site.OpenWeb())
            {
                SPList listTasks = web.Lists["Tasks"];
                SPListItem item2 = listTasks.Items[0];
                SPExportObject obj2 = new SPExportObject();
                obj2.Id = item2.UniqueId;
                obj2.Type = SPDeploymentObjectType.ListItem;

                SPExportSettings settings = new SPExportSettings();
                settings.IncludeVersions = SPIncludeVersions.LastMajor;
                settings.SiteUrl = site.Url;
                settings.IncludeSecurity = SPIncludeSecurity.None;
                settings.FileLocation = "C:\\export";
                settings.BaseFileName = "blop";
                settings.CommandLineVerbose = true;
                settings.ExportObjects.Add(obj2);
                settings.OverwriteExistingDataFile = true;

                SPExport export = new SPExport(settings);
                export.Run();
            }
        }
    }
   }
}

顺便说一句,我不知道我是否应该编辑我的问题

其他提示

原因是SharePoint API本身处理版本的方式。当您启用使用重复的文件名和版本控制调用SPFOLDER.ADD()时,添加了新版本(而不是添加了新文件)。

您可能想尝试的一件事是在导入之前启用列表上的版本控制 - 这可能允许更新(保存版本)。

如果不是,恐怕您已经确定,唯一的方法是在运行导入之前清除列表。

许可以下: CC-BY-SA归因
scroll top