如何以编程方式从SharePoint网站检索母版页的早期版本?
在SharePoint网站中,签出/修改/签入母版页时,母版页的早期版本将保留在SharePoint中,您可以在母版页库中看到早期版本的列表。在我看来,查看以前版本内容的唯一方法是对该版本进行还原-但这将在版本历史记录中创建一个附加条目,它不是真正的新版本,只是查看以前版本的一个人工制品 通过使用如何以编程方式从SharePoint网站检索母版页的早期版本?,sharepoint,wss,sharepoint-2007,Sharepoint,Wss,Sharepoint 2007,在SharePoint网站中,签出/修改/签入母版页时,母版页的早期版本将保留在SharePoint中,您可以在母版页库中看到早期版本的列表。在我看来,查看以前版本内容的唯一方法是对该版本进行还原-但这将在版本历史记录中创建一个附加条目,它不是真正的新版本,只是查看以前版本的一个人工制品 通过使用stsadm实用程序,我最终找到了一种查看以前版本的蛮力方法: stsadm -o export -url http://site -fileneme export.cab -versions 4 然
stsadm
实用程序,我最终找到了一种查看以前版本的蛮力方法:
stsadm -o export -url http://site -fileneme export.cab -versions 4
然后查看cab中的manifest.xml
文件,然后找到指向cab中相关.dat
文件的指针,以查看所需的早期版本。现在这个“解决方案”对于大型站点来说显然是有问题的,因为导出操作会导出整个站点内容
这是我的问题。。。如果stsadm-o export
可以提取以前版本的文件,我猜有某种方法可以通过SharePoint API以编程方式实现这一点。有人知道这是否/如何可能吗。也许你下课了。从SPFile对象的versions属性
另请参见课程
你应该能够得到母版画廊一样,你会任何其他列表
SPList masterPageGal = myWeb.Site.RootWeb.Lists["Master Page Gallery"];
SPFileVersion
类确实是前进的方向。下面是将default.master页面的早期版本导出到文件系统的代码片段。但是需要注意的一点是,导出版本[0]
不起作用-在尝试调用ver.OpenBinary
时会产生异常。我怀疑这与SharePoint中的整个ghosted/Ungosted问题有关,文件的原始版本与后续版本的存储方式不同。为添加到母版页库中的其他文件运行此代码在检索版本[0]
时有效。这似乎是一个问题,仅适用于原始未命名SharePoint网站中的文件
SPFile file;
SPFileVersionCollection versions;
SPFileVersion ver;
byte[] content;
FileStream fs;
SPSite site = new SPSite("http://localhost:6000");
file = site.RootWeb.GetFile("_catalogs/masterpage/default.master");
Console.WriteLine(file.Url + ", " + file.Length);
versions = file.Versions;
Console.WriteLine(versions.Count);
for (int i = 1; i < versions.Count; i++)
{
ver = versions[i];
Console.WriteLine(ver.VersionLabel + ", " + ver.Size);
content = ver.OpenBinary();
fs = new FileStream("c:\\temp\\" + ver.VersionLabel + "-default.master",FileMode.Create);
fs.Write(content, 0, content.Length);
fs.Close();
}
SPFile文件;
SPFileVersionCollection版本;
SPV版本;
字节[]内容;
文件流fs;
SPSite站点=新SPSite(“http://localhost:6000");
file=site.RootWeb.GetFile(“_catalogs/masterpage/default.master”);
Console.WriteLine(file.Url+,“+file.Length);
versions=file.versions;
Console.WriteLine(versions.Count);
for(int i=1;i
如果有人感兴趣,这里是上述代码的powershell版本:
function ExportVersions([string] $webUrl, [string]$spfilepath, [string]$filePath)
{
$web = $null
try
{
$web = get-spweb $webUrl
$file = $web.GetFile($spfilepath)
Write-host "Url: " $file.Url
Write-host "length: " $file.Length
Write-host "Number of versions: " $file.Versions.Count
Write-host
foreach ($version in $file.Versions)
{
Write-Host "Version: " $version.VersionLabel
Write-Host "Size: " $version.Size
$content = $version.OpenBinary()
$spFileName = [System.IO.Path]::GetFileName($spfilepath)
$outFileName = $filePath + $version.VersionLabel + "-$spFileName"
$fs = new-object System.IO.FileStream($outFileName,[System.IO.FileMode]::Create)
$fs.Write($content,0,$content.Length)
$fs.Close()
}
$out = "Finished exporting versions for: " + $spfilepath
Write-Host $out
Write-Host
}
catch
{
throw $_
}
finally
{
# Clean up
$web.Close()
}
}