0

我正在用 VB.Net 编写一个 Excel 文件恢复程序,它试图成为一个方便的地方来收集和访问Microsoft 推荐的方法。如果您对我可能很笨拙、充满错误且缺少足够的清理代码感兴趣,请访问:http: //pastebin.com/v4GgDteY。尽管我还没有测试过图形宏表恢复,但基本功能似乎可以工作。

我突然想到,如果 Shadow Copy Service 已打开并且存在以前的副本,Vista 和 Windows 7 用户可以从在我的应用程序中获得文件的以前版本列表中受益。我该怎么做呢?

我查看了很多网页,但发现不容易编写代码。我猜一种可能性是通过 shell 使用 vssadmin ,但这很麻烦。我只想显示一个对话框,如以前的版本属性表,并允许用户选择以前的版本之一。我想我可以通过以编程方式调用上下文菜单和“恢复以前的版本选择”来通过 shell 显示以前版本的属性表,但是我也希望能够为那些没有的 Vista Home Basic 和 Premium 用户提供列表即使显然以前的版本仍然存在,也无法访问该选项卡。此外,如果可能的话,我想为 XP 用户提供相同的功能,尽管我很确定 XP 只有系统文件在卷影副本中。

我查看了 Shadow Copy Service 上的 MSDN 并浏览了所有页面,还查看了 AlphaVSS 和 AlphaFS 以及所有评论。我有点猜测我需要使用 AlphaVss 和 AlphFS 并执行以下操作?

  1. 找出计算机上存在的快照/还原点列表。
  2. 挂载这些快照。
  3. 在已安装的卷中导航到用户想要恢复的 Excel 文件并列出这些路径。
  4. 有了方便的路径列表,与某种差异程序比较,文件的影子副本与原始文件。
  5. 拉出与恢复目标不同的那些卷影副本的最年轻或最旧版本(我认为这并不重要)。
  6. 列出发现不同的文件版本。

这看起来既麻烦又缓慢,但也许是最快的做事方式。我只需要一些确认,这是现在要走的路。

4

1 回答 1

0

我最终决定继续并开始编码。请就加快代码速度或如何处理发现与恢复文件目标不同的文件提出建议。有没有更简单的方法可以用 AlphaVSS 和 AlphaFS 做到这一点?

Private Sub Button1_Click_2(sender As System.Object, e As System.EventArgs) Handles Button1.Click

    'Find out the number of vss shadow snapshots (restore 
    'points). All shadows apparently have a linkable path 
    '\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy#,
    'where # is a simple one, two or three digit integer.
    Dim objProcess As New Process()
    objProcess.StartInfo.UseShellExecute = False
    objProcess.StartInfo.RedirectStandardOutput = True
    objProcess.StartInfo.CreateNoWindow = True
    objProcess.StartInfo.RedirectStandardError = True
    objProcess.StartInfo.FileName() = "vssadmin"
    objProcess.StartInfo.Arguments() = "List Shadows"
    objProcess.Start()

    Dim burp As String = objProcess.StandardOutput.ReadToEnd
    Dim strError As String = objProcess.StandardError.ReadToEnd()
    objProcess.WaitForExit()
    Dim xnum As Integer = 0
    Dim counterVariable As Integer = 1
    ' Call Regex.Matches method.
    Dim matches As MatchCollection = Regex.Matches(burp, _
                            "HarddiskVolumeShadowCopy")
    ' Loop over matches.
    For Each m As Match In matches
        xnum = xnum + 1
        'At the max xnum + 1 is the number of shadows that exist
    Next
    objProcess.Close()

    Do
        'Here we make symbolic links to all the shadows, one at a time 
        'and loop through until all shadows are exposed as folders in C:\.
        Dim myProcess As New Process()
        myProcess.StartInfo.FileName = "cmd.exe"
        myProcess.StartInfo.UseShellExecute = False
        myProcess.StartInfo.RedirectStandardInput = True
        myProcess.StartInfo.RedirectStandardOutput = True
        myProcess.StartInfo.CreateNoWindow = True
        myProcess.Start()
        Dim myStreamWriter As StreamWriter = myProcess.StandardInput
        myStreamWriter.WriteLine("mklink /d C:\shadow" & counterVariable _
            & " \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy" _
            & counterVariable & "\")
        myStreamWriter.Close()
        myProcess.WaitForExit()
        myProcess.Close()

        ' Here I compare our recovery target file against the shadow copies
        Dim sFile As String = PathTb.Text
        Dim sFileShadowPath As String = "C:\shadow" & _
            counterVariable & DelFromLeft("C:", sFile)
        Dim jingle As New Process()
        jingle.StartInfo.FileName = "cmd.exe"
        jingle.StartInfo.UseShellExecute = False
        jingle.StartInfo.RedirectStandardInput = True
        jingle.StartInfo.RedirectStandardOutput = True
        jingle.StartInfo.CreateNoWindow = True
        jingle.Start()
        Dim jingleWriter As StreamWriter = jingle.StandardInput
        jingleWriter.WriteLine("fc """ & sFile & """ """ _
                               & sFileShadowPath & """")
        jingleWriter.Close()
        jingle.WaitForExit()
        Dim jingleReader As StreamReader = jingle.StandardOutput
        Dim JingleCompOut As String = jingleReader.ReadToEnd
        jingleReader.Close()
        jingle.WaitForExit()
        jingle.Close()
        Dim jingleBoolean As Boolean = JingleCompOut.Contains( _
            "no differences encountered").ToString
        If jingleBoolean = "True" Then
            MsgBox(jingleBoolean)
        Else
            'I haven't decided what to do with the paths of 
            'files that are different from the recovery target.
            MsgBox("No")
        End If

        counterVariable = counterVariable + 1
    Loop Until counterVariable = xnum + 1

End Sub
于 2011-12-14T20:09:48.737 回答