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

时间:2009-02-19 04:42:06

标签: sharepoint wss sharepoint-2007

在SharePoint网站中,当您检出/修改/签入母版页时,母版页的先前版本将保留在SharePoint中,您可以在母版页库中看到以前版本的列表 。在我看来,查看以前版本的内容的唯一方法是恢复该版本 - 但是这会在版本历史中创建一个额外的条目,这不是真的一个新版本,但只是查看以前版本的人工制品。

我最终找到了一种使用stsadm实用程序查看以前版本的相当强力的方法:

stsadm -o export -url http://site -fileneme export.cab -versions 4

然后查看cab中的manifest.xml文件,然后找到指向cab中相关.dat文件的指针,以查看所需的先前版本。现在这个“解决方案”显然对大型网站有问题,因为导出操作会导出整个网站内容。

所以这是我的问题...如果stsadm -o export可以提取以前版本的文件,我猜测有一些方法可以通过SharePoint API以编程方式执行此操作。有没有人知道这是否可行。

3 个答案:

答案 0 :(得分:2)

也许你在SPFileVersion课之后。来自SPFile对象的versions属性。

另见SPListItemVersion班。

您应该可以使主页库与其他列表相同。

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()
  }
}