При коллективной работе с общей группой файлов зачастую кто-то из работников может испортить документ. Работая верстальщиком в районной газете, я сталкиваюсь с такими случаями, и приходится переверстывать некоторые элементы.
Поэтому я задумался о системе восстановления файлов. Резервное копирование на машине проводится автоматически раз в неделю, что позволяет не терять данных, однако при частом изменении документов это не спасает. Издание еженедельное, полос немного — каталог с файлами вёрстки текущего выпуска занимает 1-2 гб. У нас не имеется отдельного файлсервера, все данные хранятся на моей машине, и используется по сети еще двумя ПК. Собственно, все карты мне в руки.
Для резервного копирования я использую утилиту MAX SyncUp (не реклама). В машине 3 жестких диска: ОС/софт, вёрстка/фото и бэкапы. Создание резервной копии любого файла не отражается заметно на производительности. На третьем HDD свободного места предостаточно, поэтому я не стал использовать дополнительный софт, руководствуясь принципом «Меньше излишеств — стабильней работа системы».
Итак, я приступил к организации моей задумки.
Для начала в утилите резервного копирования создал правило, копирующее все измененные в верстке файлы в директорию X:Backup, с указанием даты и времени, раз в 7 минут (время подбиралось экспериментальным путём). Каждая версия файла имеет разницу в небольшой промежуток времени, если, конечно, была изменена. Поработав с этого понедельника, я в очередной раз столкнулся с порчей данных, и попытался их восстановить. Для этого пришлось вручную заходить в каталог с бэкапами и набирать имя полосы в поиске. Но так работать нельзя, и из принципа необходимо развить идею. Перехожу ко второй части — добавляю в контекстное меню пункт «Версии файла».
Для начала в реестре создал каталог
HKEY_CLASSES_ROOT*shellSearchcommand
В последнем добавил строковый параметр
WScript C:windowsversion.vbs "%1"
В каталоге Search в реестре выше создал строковый параметр с именем MUIVerb, задающий имя пункта. В нашем случае это «Версии файла», и параметр Icon, содержащий путь к иконке.
Что получилось:
Резервные копии у меня сохраняются в каталог автоматически по мере изменения в таком виде:
X:Backup2014-09-01T16-45Сб 3 полоса
X:Backup2014-09-02T15-32Сб 1 полоса
X:Backup2014-09-02T15-39Сб 1 полоса
Теперь пора написать VBS-скрипт, ищущий в бэкапе необходимые файлы и выдающий их списком.
Используем WSO.dll
Dim folder
Dim fso
Dim filename
Dim mass()
folder = "X:Backup" 'Здесь указывается путь к папке с бэкапами
Set WshShell = CreateObject("WScript.Shell")
rc = WshShell.Run("regsvr32.exe /s c:windowswso.dll", 0, True)
Set objArg = WScript.Arguments
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set oFolders = fso.GetFolder(folder)
Set oSubfolders = oFolders.SubFolders
filename = FSO.GetFileName(objArg(0))
Redim mass(oSubFolders.Count)
i = 1
For Each oFolder In oSubFolders
mass(i) = oFolder.Name
i=i+1
Next
Set o = WScript.CreateObject("Scripting.WindowSystemObject")
o.EnableVisualStyles = true
Set f = o.CreateForm(0,0,520,0)
f.Text = "Версии Файлов"
f.CenterControl()
Sub ButtonClick(this)
rc=WshShell.Run(this.note)
f.Close()
End Sub
Function CanClose(Sender,Result)
Result.Put(true)
End Function
files =0
for i = oSubFolders.Count to 1 Step -1
if FSO.FileExists(Folder & ""& mass(i) & "" & filename) Then
if files < 15 then
f.ClientHeight = 40 * (files +1)
f.CenterControl()
strListFolders = fso.GetBaseName(Folder & ""& mass(i) & "" & filename) & " - " & GetDate(mass(i)) & vbcrlf
SET Button = f.CreateButton(7,40 * files,490,40,strListFolders)
Button.CommandLinkButton = true
Button.OnClick = GetRef("ButtonClick")
Button.Note = chr(34) & Folder & ""& mass(i) & "" & filename & chr(34)
files = files +1
End if
End if
Next
if files =0 then
MsgBox "Файлы не найдены"
f.close
End if
f.OnCloseQuery = GetRef("CanClose")
f.Show()
o.Run()
Function StartupDir()
Dim s
s = WScript.ScriptFullName
s = Left(s,InStrRev(s,""))
StartupDir = s
End Function
Sub AboutWSO_OnHitTest(Sender,x,y,ResultPtr)
ResultPtr.put(o.Translate("HTCAPTION"))
End Sub
Sub CloseFormHandler(Sender)
Sender.Form.Close()
End Sub
function GetDate(ByVal DateIn)
If DateDiff("d",DateSerial(Left(DateIn,4),Mid(DateIn,6,2),Mid(DateIn,9,2)),Date()) = 1 Then
GetDate = "Вчера в " & Mid(DateIn,12,2) & "." & Right(DateIn,2)
ElseIf DateDiff("d",DateSerial(Left(DateIn,4),Mid(DateIn,6,2),Mid(DateIn,9,2)),Date()) > 1 Then
GetDate = Mid(DateIn,9,2) & "." & Mid(DateIn,6,2) & "." & Left(DateIn,4) & " в " & Mid(DateIn,12,2) & "." & Right(DateIn,2)
'ElseIf DateDiff("d",DateSerial(Left(DateIn,4),Mid(DateIn,6,2),Mid(DateIn,9,2)),Date()) < 1 Then
' GetDate = Mid(DateIn,9,2) & "." & Mid(DateIn,6,2) & "." & Left(DateIn,4) & " в " & Mid(DateIn,12,2) & "." & Right(DateIn,2)
ElseIf DateSerial(Left(DateIn,4),Mid(DateIn,6,2),Mid(DateIn,9,2)) = Date() Then
GetDate = "Сегодня в " & Mid(DateIn,12,2) & "." & Right(DateIn,2)
End If
end function
Что получилось:
Также я поставил автоудаление резервных файлов старше 10 дней. Так как накопленный занятый дисковый объем с понедельника по пятницу составил 6 гб, то за свободное место можно не беспокоиться. Теперь можно, не держа в памяти громоздкий софт, иметь быстрый доступ к резервным копиям, в т. ч. и по сети, ввиду отсутствия необходимости в дополнительном ПО на других машинах.
У реализации, безусловно, есть недостатки, такие как отсутствие поиска в подкаталогах и привязка к имени. Но, хотя сейчас необходимости в более гибкой структуре VBS-скрипта нет, наверняка она потребуется в будущем. Буду рад критике и предложениям.
Автор: Ubuntovod