使用SPExport和SPImport复制或移动SharePoint网站
2011-08-22 10:59
441 查看
在Microsoft.SharePoint.Deployment命名空间下,我们找到SPExport和SPImport类,其中包含了最基本的备份和还原一个网站集,网站,列表或SharePoint中的其他对象的方法,这些方法也正是SharePoint Designer所使用的。为了能够使用SPExport和SPImport,我们首先需要通过相应的设置类配置整个过程中涉及的细节信息。
此代码将创建一个存档文件,名为export.cmp,其中包含了网站集http://server/MySite中的所有信息,最后存放在文件夹C:\SPBackup下。设置FileCompression = true会产生一个CAB压缩包。 OverwriteExistingDataFile = true告诉SPExport覆盖任何现有文件。如果将其设置为false,并且export.cmp文件已存在,则将抛出一个异常。反方向的操作如下:
其中比较有趣的一点是,当在Settings对象中设置CommandLineVerbose = true时,会将输出信息写入到一个控制台窗口中,我们就可以方便的看到导入导出期间经历的详细过程。虽然SPExport和SPImport类都有一个ProgressUpdated事件,但是它不会发送此类信息。它只会发送相关对象的总数和已被处理的数量。这仅仅是一些基本的设置。现在让我们更详细的研究一下这一过程,看看如何用它来复制或移动一个网站。
第一个参数是被复制网站的网址。第二个参数是目标URL。在本例中,我们是将http://server/shenzhen/Division8复制到http://server/beijin/Division8。
这里一个有趣的地方是,如果我们调用OpenWeb时没有传递想要打开的网站的相对路径,像下面这样,则会返回根网站,当然,SPWeb.Exists将返回true。
一个繁琐但可行的方法是搜索SPWebCollection以匹配名称。使用StringComparer.CurrentCultureIgnoreCase很必要,因为名字和URL不见得大小写相同。注:这样的方法对中文标题的网站无效,因为通常中文的标题和url名称往往不同,相同的内容也要decode后才能比较,不是简单的大小写的问题了。
这里,我们通过SPSite对象获取连接字符串,然后再Webs表中查找相应的值。当然,仍然要提醒一句,直接访问数据库是不推荐的。但是,像我们这种情况,在API中实在找不到,因此没得选。
运行上面的代码会发生什么呢?是不是整个网站集都被导出了?整个SharePoint网站集是指通过SiteURL指定的站点的根网站及其下的所有子站点。然而,我们只是要其中的一个。若要导出一个网站,需要将其添加到ExportedObjects集合中。SPExport会使用该集合来标识哪些内容需要导出。如果该集合为空,就会导出所有内容。
我们指定了SourceWeb的ID,同时将Type设置为Web。在SPDeploymentObjectType枚举中包括了一系列的成员分别用于标识:Site,Web,List,ListItem,File和Folder。
1 | SPExportSettings settings = new SPExportSettings(); |
2 | settings.FileLocation = "C:\SPBackup" ; |
3 | settings.SiteUrl = http: //server/mySite |
4 | settings.FileCompression = true ; |
5 | settings.OverwriteExistingDataFile = true ; |
6 | settings.BaseFileName = "export" ; |
7 | SPExport export = new SPExport(settings); |
8 | export.Run(); |
1 | SPImportSettings settings = new SPImportSettings(); |
2 | settings.FileLocation = "C:\SPBackup" ; |
3 | settings.BaseFileName = "export" ; |
4 | SPImport import = new SPImport(settings); |
5 | import.Run(); |
复制/移动网站
我们可以创建一个类,为复制或移动网站提供一个简单的接口。1 | SPWeb web = new SPWeb( "http://server/shenzhen/Division8" , "http://server/beijing" ); |
2 | web.Copy(); |
验证源网站
第一件必须做的事情是验证源网站的存在。01 | private void ValidateSource() |
02 | { |
03 | try |
04 | { |
05 | Uriuri = new Uri(SourceURL); |
06 |
07 | SourceSite= new Microsoft.SharePoint.SPSite(SourceURL); |
08 | if (SourceSite!= null ) |
09 | { |
10 | SourceWeb= SourceSite.OpenWeb(uri.LocalPath); |
11 | if (!SourceWeb.Exists) |
12 | { |
13 | SourceWeb.Dispose(); |
14 | SourceWeb= null ; |
15 | throw new ArgumentException( "源网站无效" ); |
16 | } |
17 | } |
18 | } |
19 | catch (System.IO.FileNotFoundException) |
20 | { |
21 | //找不到指定的网站 |
22 | throw new ArgumentException( "SourceURLis invalid" ); |
23 | } |
24 | } |
1 | SourceWeb= SourceSite.OpenWeb(); |
1 | string web = SourceURL.Replace(SourceSite.Url, "" ).Remove(0,1); |
2 | if (SourceSite.AllWebs.Names.Contains(uri.LocalPath, |
3 | StringComparer.CurrentCultureIgnoreCase)) |
4 | { |
5 | SourceWeb= SourceSite.OpenWeb(); |
6 | } |
验证目标网站
目标网站同样需要验证。如果同名的网站已经存在,我们必须检查器类型。如果和源网站不同,在导入过程中会抛出一个异常。因此必须首先将其删除。不必提前创建好一个新网站,因为在导入过程中会自动创建。如果网站的类型相同,在导入过程中目标网站会被覆盖。01 | private void ValidateDestination() |
02 | { |
03 | try |
04 | { |
05 | Uriuri = new Uri(DestinationURL); |
06 |
07 | DestinationSite= new Microsoft.SharePoint.SPSite(DestinationURL); |
08 | if (DestinationSite!= null ) |
09 | { |
10 | DestinationWeb= DestinationSite.OpenWeb(uri.LocalPath); |
11 | if (DestinationWeb.Exists) |
12 | { |
13 | CompareTemplates(); |
14 | } |
15 | else |
16 | { |
17 | throw new ArgumentException( "目标网站无效" ); |
18 | } |
19 | } |
20 | } |
21 | catch (System.IO.FileNotFoundException) |
22 | { |
23 | //找不到指定网站 |
24 | throw new ArgumentException( "目标网站无效" ); |
25 | } |
26 | } |
27 |
28 | private void CompareTemplates() |
29 | { |
30 | uint localID = Convert.ToUInt16(SourceWeb.Locale.LCID); |
31 |
32 | string templateName = |
33 | GetTemplateName(SourceSite.ContentDatabase.DatabaseConnectionString, |
34 | SourceWeb.ID,SourceWeb.WebTemplate); |
35 |
36 | SPWebTemplatesourceTemplate = |
37 | SourceSite.GetWebTemplates(localID)[templateName]; |
38 |
39 | templateName= |
40 | GetTemplateName(DestinationSite.ContentDatabase.DatabaseConnectionString, |
41 | DestinationWeb.ID,DestinationWeb.WebTemplate); |
42 |
43 | SPWebTemplatedestTemplate = |
44 | DestinationSite.GetWebTemplates(localID)[templateName]; |
45 |
46 | //如果模板不同,则需要先删除目标网站 |
47 | if (sourceTemplate.Name!= destTemplate.Name) |
48 | { |
49 | RecursivelyDeleteWeb(DestinationWeb); |
50 | DestinationWeb.Dispose(); |
51 | DestinationWeb= null ; |
52 | } |
53 | } |
查看SPWebTemplate
当对网站的SPWebTemplate进行比较时,着眼点首先会放在WebTemplate属性上。然而,该属性并不能为准确的比较提供足够的信息。比如,对于使用基本会议工作区模板创建的一个网站来说,SPWeb.WebTemplate会返回MPS。对于使用空白网站模板创建的一个网站,会返回STS。而准确的模板名称分别应该是MPS#1和STS#1。这些特定的配置信息在哪儿呢?很不幸,SPWeb对象上貌似找不到。唯一可以找到该信息的地方是WSS_Content内容数据库。01 | private string GetTemplateName( string connString, Guid id, string webTemplate) |
02 | { |
03 | string cmdText = string .Format( "SELECTProvisionConfig FROM " + |
04 | "dbo.WebsWHERE Id = '{0}'" ,id.ToString()); |
05 | int provisionConfig = 0; |
06 | using (SqlConnectionconn = new SqlConnection(connString)) |
07 | { |
08 | using (SqlCommandcmd = new SqlCommand(cmdText, conn)) |
09 | { |
10 | conn.Open(); |
11 | provisionConfig= Convert.ToInt32(cmd.ExecuteScalar()); |
12 | } |
13 | } |
14 |
15 | return string .Format( "{0}#{1}" ,webTemplate, provisionConfig); |
16 | } |
导出网站
正如上面提到的,导出过程的配置需要一个settings类,这里是SPExportSettings。01 | SPExportSettings settings = new SPExportSettings(); |
02 | settings.FileLocation =ExportPath; |
03 | settings.BaseFileName =EXPORT_FILENAME; |
04 | settings.SiteUrl= SourceSite.Url; |
05 |
06 | settings.ExportMethod= SPExportMethodType.ExportAll; |
07 | settings.FileCompression = true ; |
08 | settings.IncludeVersions= SPIncludeVersions.All; |
09 | settings.IncludeSecurity= SPIncludeSecurity.All; |
10 | settings.ExcludeDependencies= false ; |
11 | settings.ExportFrontEndFileStreams= true ; |
12 | settings.OverwriteExistingDataFile = true ; |
13 |
14 | SPExport export = new SPExport(settings); |
15 | export.Run(); |
1 | SPExportObjectexpObj = new SPExportObject(); |
2 | expObj.IncludeDescendants= SPIncludeDescendants.All; |
3 | expObj.Id= SourceWeb.ID; |
4 | expObj.Type= SPDeploymentObjectType.Web; |
5 | settings.ExportObjects.Add(expObj); |
导入网站
viewsourceprint?01 | private void Import() |
02 | { |
03 | if (DestinationSite== null ) |
04 | throw new ApplicationException( "目标网站为空" ); |
05 |
06 | SPImportSettings settings = new SPImportSettings(); |
07 |
08 | settings.FileLocation =ExportPath; |
09 | settings.BaseFileName =EXPORT_FILENAME; |
10 | settings.IncludeSecurity= SPIncludeSecurity.All; |
11 | settings.UpdateVersions= SPUpdateVersions.Overwrite; |
12 | settings.RetainObjectIdentity= false ; |
13 | settings.SiteUrl= DestinationSite.Url; |
14 | settings.WebUrl= DestinationURL; |
15 |
16 | SPImport import = new SPImport(settings); |
17 | import.Run(); |
18 | } |
相关文章推荐
- 使用SPExport和SPImport复制或移动SharePoint网站
- 用SPExport和SPImport复制或移动SharePoint网站
- SharePoint 2013 Rest and SP.js Copyto and Moveto (Rest 和SP.js 基本用法之 复制和移动文件)
- 复制或移动SharePoint网站(续)——各种方式的调用
- 在使用直观升级升级到 SharePoint 2010 的自定义搜索页面上显示服务器功能区和“网站操作”菜单
- 在C#开发中如何使用Client Object Model客户端代码获得SharePoint 网站、列表的权限情况
- 怎样在SharePoint的网站中使用树控件
- SharePoint 2010 使用客户端对象模型ECMAScript复制文件
- ubuntu上eclipse无法使用复制行并上/下移动热键 Ctrl + Alt + Up/Down
- 使用stsadm.exe工具实现SharePoint网站备份还原
- Wss3:备份、还原或移动 SharePoint 网站的几种方法
- sharepoint 2013 文档库 使用资源管理器打开是灰色的,浏览器版本是IE 9在IE 11可正常打开,或提示在文件资源管理器中打开此位置时遇到问题,将此网站添加到受信任站点列表,然后重试
- 解决:SharePoint当中的STP网站列表模板没有办法导出到其它语言环境中使用
- SharePoint 2013中使用SP.UI.ModalDialog.showModalDialog时showModalDialog未定义的解决办法
- Sharepoint 复制备份系列--使用编程方式复制列表2(Copy a SharePoint List or site ,web Programmatically)
- Linux文件的复制、删除和移动命令使用说明
- SharePoint 使用代码创建 SPWeb/SPSiite/SPWebApplication以及WebPart添加到页面与删除 (三)
- 使用 SharePoint Solution Generator 对 SharePoint 工作组网站进行反向工程
- jQuery Mobile 移动网站开发之日期控件Mobiscroll 2.5 使用说明