Всем привет. Как обычно сначала предыстория.
Работаю я в одной государственной конторе сисадмином и стоит там древний очень древний сервак в котором стоят древние диски в RAID массиве. И есть у меня там напарник, он же мой начальник который всю жизнь там работает и он тоже древний — так то ему нужно было уйти на пенсию, но из за повышения пенсионного возраста он никуда не пошел, продолжает дальше работать.
Так вот я к чему — и давным давно в древние времена настроил он на этом сервере ежедневные Backup’ы через NTBackup и думал что это всё на века, как и Windows NT который крутится на этом сервере и завещал мне не лазить своими ручонками на этот сервер, так как там всё настроено на века!
И вот одни прекрасным утром захожу я в серверную, а сервер то наглухо завис. После перезагрузки выясняется что два диска их 4х в массиве не работают и это очень критично. В общем сервера не стало.
А что же с теми волшебными Backup’ами что были на века ? Штатными средствами они не открывались, так как значились как поврежденные. Да и какими штатными средствами то ? В современных Windows нет таких средств что могли бы открывать BKF файлы.
В общем после очень долгих поисков по всяких в том числе завирусованным ресурсам мне удалось найти BKF Recovery — она если что платная и довольно редкая чтобы была просто так в свободном доступе, но мне удалось её найти. С помощью её мне удалось увидеть и вытащить все файлы из BKF архива, но тут меня ждала другая неприятность. Я открыл просто посмотреть всё ли на месте, первый попавшийся txt файл и обнаружил что там текст в двойном экземпляре. Открываю первую попавшуюся ini’шку, то же самое — там двойные данные. Попробовал запустить exe’файл — он не запускается, некоторые архивы не открываются.
Короче многие файлы просто стали ровно в 2 раза больше. Что делать ? Само собой компетенция моего напарника на этом всё, а я стал думать что с этим делать.
В общем решил написать программу которая бы считывала каждый файл, делила бы его на две части и если контрольная сумму обоих частей равно, значит мы пишем на своё старое место только одну часть, если же контрольная сумма не равно значит файл не пострадал.
Вот такую программу я написал на коленке.
$FileRestore = '12042024_1.txt'
For $n = 2 To FileReadLine ($FileRestore, 1)
$ReadLine = FileReadLine ($FileRestore, $n)
If FileExists ($ReadLine) = 1 Then
Desitnegrator ($ReadLine)
Else
FileWriteLine ('e:\au3\checkfiles\log_without.txt', $ReadLine)
EndIf
ToolTip (13470-$n & ' - ' & $n & '.' & $ReadLine, 10, 10)
Next
Func Desitnegrator ($FileName)
$Path = $FileName
$File1 = "temp1"
$File2 = "temp2"
$ReadFile = FileOpen($Path, 16)
If $ReadFile = -1 Then
;MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
$FileSize = FileGetSize($Path)
$HalfSize = $FileSize / 2
; Чтение и запись первой половины файла в первый файл
$WriteFile1 = FileOpen($File1, 2)
If $WriteFile1 = -1 Then
;MsgBox(0, "Error", "Unable to open first output file.")
Exit
EndIf
For $i = 1 To $HalfSize
$byte = FileRead($ReadFile, 1)
If @error Then ExitLoop ; проверяем, достигли ли конца файла
FileWrite($WriteFile1, $byte)
Next
FileClose($WriteFile1)
; Чтение и запись второй половины файла во второй файл
$WriteFile2 = FileOpen($File2, 2)
If $WriteFile2 = -1 Then
;MsgBox(0, "Error", "Unable to open second output file.")
Exit
EndIf
While True
$byte = FileRead($ReadFile, 1)
If @error Then ExitLoop ; проверяем, достигли ли конца файла
FileWrite($WriteFile2, $byte)
WEnd
FileClose($WriteFile2)
FileClose($ReadFile)
; Проверка идентичности полученных файлов
If _FileCompare($File1, $File2) Then
;MsgBox(0, "Готово", "Данный файл двойной, заменяю оригинал.")
FileDelete($Path)
FileMove($File1, $Path)
;FileCopy($File1, $Path)
FileDelete($File2)
FileWriteLine ('e:\au3\checkfiles\logs.txt', $Path & ' - ' & $FileSize)
Else
;MsgBox(0, "Готово", "Данный файл не изменен.")
FileDelete($File1)
FileDelete($File2)
EndIf
EndFunc
Func _FileCompare($File1, $File2)
Local $hFile1 = FileOpen($File1, 16)
Local $hFile2 = FileOpen($File2, 16)
If $hFile1 = -1 Or $hFile2 = -1 Then
Return False
EndIf
Local $bEqual = True
While True
Local $byte1 = FileRead($hFile1, 1)
Local $byte2 = FileRead($hFile2, 1)
If $byte1 <> $byte2 Then
$bEqual = False
ExitLoop
EndIf
If @error Then ExitLoop
WEnd
FileClose($hFile1)
FileClose($hFile2)
Return $bEqual
EndFunc
Так как одни из самых чувствительных файлов это архивы — проверил на них, всё открывается.