VB.Net: Как отобразить предыдущие версии файла теневого копирования, позволяющие пользователю выбрать один

Я пишу программу восстановления файлов Excel с VB.Net, которая пытается быть удобным местом для сбора и доступа к рекомендуемым методам Microsoft. Если вы заинтересованы в моем, вероятно, клудном, заполненном ошибками и не имеющем достаточно кода для очистки, это здесь: http://pastebin.com/v4GgDteY. Базовая функциональность, кажется, работает, хотя я еще не тестировал восстановление таблицы макроса графа.

Мне пришло в голову, что пользователи Vista и Windows 7 могут получить выгоду от предложения списка предыдущих версий файла в моем приложении, если включена служба теневого копирования и есть предыдущие копии. Как мне это сделать?

Я просмотрел множество веб-страниц, но не нашел легкого кода для кроватки. Я предполагаю, что одной из возможностей будет использование vssadmin через оболочку, но это довольно громоздко. Я просто хочу отобразить диалоговое окно, подобное списку свойств "Предыдущие версии", и позволить пользователям выбрать одну из предыдущих версий. Я думаю, что я мог бы просто отобразить страницу свойств предыдущей версии через оболочку, программно вызвав контекстное меню и "Выбор предыдущих версий", однако я также хочу иметь возможность предложить список для пользователей Vista Home Basic и Premium, которые не У него нет доступа к этой вкладке, хотя, очевидно, предыдущие версии все еще существуют. Кроме того, если это возможно, я хотел бы предложить пользователям XP ту же функциональность, хотя я уверен, что с XP только системные файлы находятся в теневых копиях.

Я посмотрел на MSDN в службе теневого копирования и просмотрел все страницы, также я посмотрел на AlphaVSS и AlphaFS и все комментарии. Я отчасти догадываюсь, что мне нужно использовать AlphaVss и AlphFS и делать следующее?

  1. Узнайте список снимков / точек восстановления, которые существуют на компьютере.
  2. Смонтировать эти снимки.
  3. Перейдите в подключенных томах к файлу Excel, который пользователь хочет восстановить, и составьте список этих путей.
  4. Имея удобный список путей, сравните с какой-нибудь программой сравнения теневые копии файлов с оригиналом.
  5. Вытащите самую младшую или самую старую версию (я не думаю, что это имеет значение) тех теневых копий, которые отличаются от цели восстановления.
  6. Перечислите те версии файлов, которые оказались разными.

Это кажется громоздким и медленным, но, возможно, это самый быстрый способ сделать что-то. Мне просто нужно какое-то подтверждение, что сейчас это путь.

2 ответа

Решение

Я наконец решил пойти дальше и начать кодирование. Пожалуйста, внесите предложения по ускорению кода или что делать с файлами, которые, как находят, отличаются от цели файла восстановления. Есть ли более простой способ сделать это с 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

Вот код до сих пор. Если кто-то хочет комментировать, я буду читать: http://pastebin.com/81iHJ5C8

Другие вопросы по тегам