文档库的版本控制——SPFileVersion

   作者:柒月

描述

SharePoint文档库开启版本控制后,可对文档进行版本管理。 通过以下代码可以获取各版本信息。

SPFile file = 获取SPFile;
foreach (SPFileVersion version in file.Versions)//SPFile.Versions返回的类型是SPFileVersionCollection
{
    string comment = version.CheckInComment;//签入日志
    string versionNo = version.VersionLabel;//版本号
    SPFile versionFile = version.File;
    byte[] versionFileByte = versionFile.OpenBinary();
    //TODO 导出历史版本文件
}

慢着,代码执行后,本应该导出各版本的文件,现在却导出了N份最新版本的文件。有什么奇怪的东西混进去了?

思考

SPFileVersion.File是一个SPFile对象,若它表示某历史版本的文件,那么它所对应的SPFile.Versions又是什么?历史版本文件的历史版本文件集合?好矛盾,好纠结,显然错误得很彻底。

再仔细瞅瞅SPFileVersion.File的Summary:Gets the parent file for the version. 原来这是用来获取父文件(Release版本文件)的。而SPFileVersion.OpenBinary() Returns a byte array that contains the file version.才是用来获取历史版本文件的。

有码有真相

反编译一下Microsoft.SharePoint.dll找到SPFileVersion.File属性 :D

public SPFile File
{
    get
    {
        //m_FileVersions为SPFileVersionCollection
        return this.m_FileVersions.File;
    }
}

顺道发现了另一个有意思的东西SPFileVersion.VersionLabel,版本号,值为1.0 2.2 3.12 等。小数点前的数字是主要版本号;小数点后面的数字为次要版本号。

public string VersionLabel
{
    get
    {
        //this.ID为内部版本号,每产生一个主要版本this.ID+=512,每产生一个次要版本this.ID+=1
        //num为主要版本号,SPFile.MAX_MINORVERSION是readonly的,值为512
        int num = this.ID / SPFile.MAX_MINORVERSION;
        //num2为次要版本号
        int num2 = this.ID % SPFile.MAX_MINORVERSION;
        return (num.ToString() + '.' + num2.ToString());
    }
}

这样看来,一个文件最多有511个次要版本,第512个次要版本自动发布成主要版本咯? XDD