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 и делать следующее?
- Узнайте список снимков / точек восстановления, которые существуют на компьютере.
- Смонтировать эти снимки.
- Перейдите в подключенных томах к файлу Excel, который пользователь хочет восстановить, и составьте список этих путей.
- Имея удобный список путей, сравните с какой-нибудь программой сравнения теневые копии файлов с оригиналом.
- Вытащите самую младшую или самую старую версию (я не думаю, что это имеет значение) тех теневых копий, которые отличаются от цели восстановления.
- Перечислите те версии файлов, которые оказались разными.
Это кажется громоздким и медленным, но, возможно, это самый быстрый способ сделать что-то. Мне просто нужно какое-то подтверждение, что сейчас это путь.
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