如何以编程方式从SharePoint网站检索母版页的早期版本?

如何以编程方式从SharePoint网站检索母版页的早期版本?,sharepoint,wss,sharepoint-2007,Sharepoint,Wss,Sharepoint 2007,在SharePoint网站中,签出/修改/签入母版页时,母版页的早期版本将保留在SharePoint中,您可以在母版页库中看到早期版本的列表。在我看来,查看以前版本内容的唯一方法是对该版本进行还原-但这将在版本历史记录中创建一个附加条目,它不是真正的新版本,只是查看以前版本的一个人工制品 通过使用stsadm实用程序,我最终找到了一种查看以前版本的蛮力方法: stsadm -o export -url http://site -fileneme export.cab -versions 4 然

在SharePoint网站中,签出/修改/签入母版页时,母版页的早期版本将保留在SharePoint中,您可以在母版页库中看到早期版本的列表。在我看来,查看以前版本内容的唯一方法是对该版本进行还原-但这将在版本历史记录中创建一个附加条目,它不是真正的新版本,只是查看以前版本的一个人工制品

通过使用
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()
  }
}