1

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

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

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

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

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

4

3 回答 3

2

也许您在SPFileVersion类之后。来自 SPFile 对象的版本属性。

另请参见SPListItemVersion类。

您应该能够像获得任何其他列表一样获得母版页画廊。

SPList masterPageGal = myWeb.Site.RootWeb.Lists["Master Page Gallery"];
于 2009-02-19T07:16:04.833 回答
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();
    }
于 2009-02-20T05:03:03.057 回答
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()
  }
}
于 2014-08-15T04:37:52.693 回答