It Hints
Search
Close this search box.

Всем при­вет. Как обыч­но сна­ча­ла предыстория.

Рабо­таю я в одной госу­дар­ствен­ной кон­то­ре сисад­ми­ном и сто­ит там древ­ний очень древ­ний сер­вак в кото­ром сто­ят древ­ние дис­ки в 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
				
			

Так как одни из самых чув­стви­тель­ных фай­лов это архи­вы — про­ве­рил на них, всё открывается.

Друзья - если вы нашли для себя что то полезное и хотите помочь проекту развиваться дальше, Вы можете задонатить любую сумму на поддержку. Деньги пойдут исключительно на оплату доменного имени, хостинга, а так же на мотивацию.

Facebook
Twitter
Email
VK
WhatsApp
Telegram