在处理如Microsoft Outlook的PST文件备份时,通常会遇到一些限制,比如只能使用特定的备份工具,如Microsoft Backup。但如果只想备份PST文件,并且希望备份副本能够立即被访问,而不是压缩在BKF文件中,那么Microsoft Volume Shadow Copy Service(VSS)是一个解决方案。VSS是微软备份和其他备份工具能够复制锁定文件的方式。
当第一次开始研究Volume Shadow Copy时,并不清楚从何开始。曾以为可能需要创建并注册一个提供者。但后来,Craig Andera的HOBOCOPY博客帖子中的一位评论者提到了一个VSSCoordinatorClass,这正是需要的。VSSCoordinatorClass似乎没有文档记录。如果在Google上搜索它,只能找到原始的博客评论以及一两个非官方且不太有帮助的参考资料。MSDN也没有提到它。这个类似乎暴露了IVssBackupComponents接口的方法,这是创建影子副本所需要的。
要创建一个卷影副本,需要执行以下步骤:
附带的源代码是一个简单的实用程序,它扫描源目录和任何子目录以查找PST文件。找到的任何PST文件都被复制到目标目录。要使用此实用程序,请从Zip文件中提取文件。运行makeshadowcopy.exe,使用以下参数:
请注意,默认情况下,这两个Windows服务设置为“手动”,并且需要启动Volume Shadow Copy才能工作:
以下是一个封装了Volume Shadow Copy的类的示例。这个类使用卷名(例如:“C:”或“E:”)实例化,一旦实例化,DeviceName属性将返回影子卷的名称。完成影子卷的操作后,使用Delete方法释放它。
Public Class Snapshot
' Note: The following two windows services are stopped by default.
'
' For volume shadow copy to function
'
' they need to be started.
'
Volume Shadow Copy service
MS Software Shadow Copy Provider
'
Technet article describing how Volume Shadow Copy works:
'
http://technet2.microsoft.com/windowsserver/en/library/
'
2b0d2457-b7d8-42c3-b6c9-59c145b7765f1033.mspx?mfr=true
'
Thanks to Craig Andera for his HOBOCOPY blog
'
posting which provided the basis for this code.
'
http://www.pluralsight.com/blogs/craig/archive/2006/09/20/38362.aspx
'
Note: More information about programming
'
the volume shadow copy service is available here:
'
http://msdn2.microsoft.com/en-us/library/aa384649.aspx
'
Note: The microsoft volume shadow copy service
'
SDK with headers and utilties is available here:
'
http://www.microsoft.com/downloads/details.aspx?
'
FamilyID=0B4F56E4-0CCC-4626-826A-ED2C4C95C871&displaylang=en
Private Const VSS_E_BAD_STATE = &H80042301
' ... 更多常量定义 ...
Private moSnapshotSetID As New Guid
Private moSnapshotID As New Guid
Private msDeviceName As String
Public Sub New(ByVal sVolume As String)
Dim vss As New VSS.VSSCoordinatorClass
Abort(vss)
MakeNewSnapshot(vss, sVolume, moSnapshotSetID, moSnapshotID)
msDeviceName = GetSnapshotDeviceName(vss, moSnapshotID)
End Sub
Public ReadOnly Property DeviceName() As String
Get
Return msDeviceName
End Get
End Property
' ... 更多方法定义 ...
End Class