在SharePoint网站中,当您检出/修改/签入母版页时,母版页的先前版本将保留在SharePoint中,您可以在母版页库中看到以前版本的列表 。在我看来,查看以前版本的内容的唯一方法是恢复该版本 - 但是这会在版本历史中创建一个额外的条目,这不是真的一个新版本,但只是查看以前版本的人工制品。
我最终找到了一种使用stsadm
实用程序查看以前版本的相当强力的方法:
stsadm -o export -url http://site -fileneme export.cab -versions 4
然后查看cab中的manifest.xml
文件,然后找到指向cab中相关.dat
文件的指针,以查看所需的先前版本。现在这个“解决方案”显然对大型网站有问题,因为导出操作会导出整个网站内容。
所以这是我的问题...如果stsadm -o export
可以提取以前版本的文件,我猜测有一些方法可以通过SharePoint API以编程方式执行此操作。有没有人知道这是否可行。
答案 0 :(得分:2)
也许你在SPFileVersion课之后。来自SPFile对象的versions属性。
您应该可以使主页库与其他列表相同。
SPList masterPageGal = myWeb.Site.RootWeb.Lists["Master Page Gallery"];
答案 1 :(得分:0)
SPFileVersion
课程确实是前进之路。这是一段代码,它将以前版本的default.master页面导出到文件系统。需要注意的一点是,导出versions[0]
不起作用 - 在尝试调用ver.OpenBinary
时会产生异常。我怀疑这与SharePoint中的整个幻影/无主题问题有关,该文件的原始版本与后续版本的存储方式不同。对于添加到母版页库的其他文件运行此代码,在检索versions[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();
}
答案 2 :(得分:0)
如果有兴趣的话,这是上面代码的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()
}
}