从 SharePoint 文档库下载文件的所有版本






4.71/5 (5投票s)
此代码片段可用于从给定文档库内的文件夹和子文件夹中下载文档的所有版本(如果存在)。
引言
几天前,我提交了一个名为 File Shunter 的代码片段,该片段可用于将多个文件批量上传到 SharePoint (2003/2007) 文档库,并更新元数据以及切换版本控制的开启/关闭。此代码片段(我之前在网上找到过其中的一些部分)名为 Anti Shunter,可用于从文档库中下载所有文档的所有版本(最多任意数量的文件夹,如果存在),并且可以配置为保留上传的创建日期和修改日期。
背景
几天前,我们不得不从 SharePoint 2003 升级到 MOSS 2007,并且我们维护了一个大型文档库,用于电子文档系统(大约 200,000 个文件,包含许多版本),并且没有一种就地或其他方法可以帮助升级到 SP 2007。 我们维护了许多元数据列,这些列主要由文件名组成。 因此,我不得不编写一些代码,这些代码可以将所有文件的所有版本下载到文件夹结构中,保留其实际的创建日期和修改日期,并根据元数据列的要求组合文件名。
使用代码
以下代码可以用于多种方式来获取单个所需文件、所有文件或根据某些元数据列或标题/名称列过滤的几个文件。 我使用了 SharePoint 2007 对象模型(基于 Microsoft.SharePoint.dll)并使用了 SPFile
和 SPWeb
类来访问文件及其版本,并且每个版本都需要元数据。 例如,一个文件在名为 A 的文件夹中包含五个版本,则此代码将创建一个文件夹“A”,其中包含四个子文件夹,分别命名为“Revision-4”、“Revision-3”、“Revision 2”、“Revision 1”,每个文件夹都包含该文件版本,并且当前文件将在“A”文件夹中,位于其他修订子文件夹之外。 因此,现在,可以将此文件夹结构重新上传到新的文档库中,或用于任何其他所需的目的。 以下函数可以递归使用,以便访问文档库中的所有文件夹/子文件夹。 可以访问名为“创建日期”和“修改日期”的文档库列并将其存储到变量中,并且在保存文件时,可以使用 FileSystem
类来更新文件的创建日期和修改日期。
Private Function AccessFolder(ByVal folder As SPFolder) As Long
Dim strPath As String = String.Empty
Dim lFolderSize As Long = 0
If m_strExportDir <> String.Empty Then
strPath = folder.ServerRelativeUrl
End If
Dim iTotalVersions As Integer = 0
Dim iI As Integer = 0
Dim FinalFileName As String = ""
Dim dt_SPFileCreated As DateTime
Dim s_FileName As String = ""
For Each file As SPFile In folder.Files
iTotalVersions = file.Versions.Count
Dim versions As SPFileVersionCollection = file.Versions
For iI = 0 To iTotalVersions - 1
iTotalDocs = iTotalDocs + 1
Dim version As SPFileVersion = versions(iI)
' Dim hash As System.Collections.Hashtable = _
file.Versions(iI).Properties
' Dim keys As System.Collections.ICollection = hash.Keys
s_FileName = file.Name
dt_SPFileCreated = file.Versions(iI).Created
m_iTotalFileVersions += 1
' Now the above declared hash and keys can be used
' to acces each metadata columns
' as follows
' Dim key As Object
'For Each key In keys
'If key.ToString.ToLower = "Ur Custom Column Name" Then
' Do whatever required
' End if
FinalFileName = file.name
System.IO.Directory.CreateDirectory(Pathtofilesystemtosave + _
"\Revision-" + m_iTotalFileVersions.ToString)
Dim sFileLoc As String = path + "\Revision-" + _
m_iTotalFileVersions.ToString + "\\" + FinalFileName
Dim binFile As Byte() = version.OpenBinary()
If binFile.Length > 0 Then
Dim fs As FileStream = New FileStream(sFileLoc, _
FileMode.OpenOrCreate, FileAccess.Write)
fs.Write(binFile, 0, binFile.Length)
fs.Close()
End If
Next
' Now for current file
iI = iI + 1
iTotalDocs = iTotalDocs + 1
Dim hash As System.Collections.Hashtable = file.Properties
Dim keys As System.Collections.ICollection = hash.Keys
s_FileName = file.Name
dt_SPFileCreated = file.TimeCreated
' In the same way as above for versions, Key ca be declared to access
' hash table for meta data column collection to access(skipping)
FinalFileName = file.Name
System.IO.Directory.CreateDirectory(Pathtofilesystemtosave + _
"\Revision-" + iI.ToString)
Dim sFileLoc As String = Path + "\Revision-" + _
iI.ToString + "\\" + FinalFileName
Dim binFile As Byte() = file.OpenBinary()
If binFile.Length >= 0 Then
Dim fs As FileStream = New FileStream(sFileLoc, _
FileMode.OpenOrCreate, FileAccess.Write)
fs.Write(binFile, 0, binFile.Length)
fs.Close()
end if
Next
End Function