Hallo... dies ist mein erster Post ^^
ich hab mal die Idee von Real aufgegriffen, und daraus 2 Procedures gemacht... funzt auch, wenn die 2 dateien nicht gleich groß sind...
achja, purebasic ist toll ^^
Code: Alles auswählen
;createpatch(file1.s,file2.s,patchpath.s)
;file1 = Pfad zur alten Version einer Datei
;file2 = Pfad zur neuen Version einer Datei
;Patchpath = Speicherpfad des Patches
Procedure createpatch(file1.s,file2.s,patchpath.s)
Protected MemPoint.l = 0 , LenOfFile1.l , LenOfFile2.l
Protected ByteOld.b , ByteNew.b
Protected *Data1, *Data2, *Data3
;Wenn file1 = file2, Prozedure verlassen
If MD5FileFingerprint(file1) = MD5FileFingerprint(file2)
ProcedureReturn #False
EndIf
ReadFile(0,file1)
ReadFile(1,file2)
LenOfFile1 = Lof(0)
LenOfFile2 = Lof(1)
*Data1 = AllocateMemory(LenOfFile1)
*Data2 = AllocateMemory(LenOfFile2)
*Data3 = AllocateMemory(LenOfFile2+33) ; '+33' für den MD5 Header
ReadData(0,*Data1,LenOfFile1)
ReadData(1,*Data2,LenOfFile2)
PokeS(*Data3,MD5FileFingerprint(file1)) ; Speichert MD5Fingerprint
While MemPoint < LenOfFile2
If MemPoint < LenOfFile1
ByteOld = PeekB(*Data1+MemPoint)
Else
ByteOld = 0
EndIf
ByteNew = PeekB(*Data2+MemPoint)
If ByteOld = ByteNew
PokeB(*Data3+33+MemPoint,0) ;ja nicht den MD5 Header überschreiben
Else
PokeB(*Data3+33+MemPoint,ByteOld-ByteNew)
EndIf
MemPoint = MemPoint + 1
Wend
CreatePack(patchpath)
AddPackMemory(*Data3,LenOfFile2+33,9)
ClosePack()
CloseFile(0) ;keine Ahnung wann man am besten file1 u. file2 closed
CloseFile(1)
FreeMemory(*Data1)
FreeMemory(*Data2)
FreeMemory(*Data3)
ProcedureReturn #True
EndProcedure
Code: Alles auswählen
;patchit(file1.s,pak.s)
;file1 = Pfad zur alten Version einer Datei
;pak = Pfad zum Patch
Procedure patchit(file1.s,pak.s)
Protected ByteOld.b , ByteDiff.b
Protected PakMD5.s
Protected PakSize.l, i.l
Protected *Patch, *DataFile
OpenPack(pak)
*Patch = NextPackFile()
PakSize = PackFileSize()
PakMD5 = PeekS(*Patch,32)
If MD5FileFingerprint(file1) <> PakMD5 ;MD5 überprüfen
ProcedureReturn #False
EndIf
CopyFile(file1,file1+".backup") ;Backup erstellen
OpenFile(0,file1)
For i = 33 To PakSize ;Nachdem MD5Header weiterlesen
FileSeek(0,i-33)
ByteOld = ReadByte(0)
ByteDiff = PeekB(*Patch+i)
FileSeek(0,i-33)
WriteByte(0,ByteOld-ByteDiff)
Next i
If (PakSize-33) < Lof(0) ;Wenn Original-Datei > Update Datei, dann....
FileSeek(0,0)
*DataFile = AllocateMemory(PakSize-33)
ReadData(0,*DataFile,PakSize-33)
CloseFile(0)
DeleteFile(file1)
CreateFile(0,file1)
WriteData(0,*DataFile,PakSize-33)
EndIf
CloseFile(0)
ClosePack()
FreeMemory(*Patch)
FreeMemory(*DataFile)
ProcedureReturn #True
EndProcedure