Code archives/File Utilities/Recursive CRC-32 file builder
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Takes a directory and recursively calculates crc-32 for all files and stores it in a file. Great for online game patchers. Simply use the tool to build a list, and your patcher can download patchlist.txt and see if the CRC of any game files have changed and if so, download the new one. NOTE: It's hardcoded to the path the exe file is in, and it skips patchlist.txt and buildcrc.exe due to obvious reasons :) | |||||
; Recursive directory list CRC-32 builder by Odin Jensen (www.furi.dk)
; Setup CRC stuff
Dim CRC32_table(255)
CRC32_init()
Global outfile = WriteFile("patchinfo.dat")
Print("CRC-32 list builder by Odin Jensen")
Print("----------------------------------")
Print("")
BuildList("./")
CloseFile(outfile)
Print("")
Print("Done.")
; Build list function
Function BuildList(From_$)
Local MyDir, MyFile$
MyDir = ReadDir(From_$)
MyFile$ = NextFile$(MyDir)
MyFile$ = NextFile$(MyDir)
Repeat
MyFile$ = NextFile$(MyDir)
If MyFile$ = "" Then Exit
If FileType(From_$ + "\" + MyFile$) = 2 Then
BuildList(From_$ + "\" + MyFile$)
Else
temp$ = Replace(From_$ + "\" + MyFile$, "./\", "")
If ((Not Right(temp, 13) = "patchinfo.dat") And (Not Right(temp, 12) = "buildcrc.exe"))
crc32% = CRC32_FromFile(temp)
WriteLine(outfile, temp + "," + Str(Hex(crc32)))
Print("> CRC32 for file '" + temp + "' is " + Str(Hex(crc32)))
End If
End If
Forever
CloseDir(MyDir)
End Function
; CRC init function
Function CRC32_Init()
Local i
Local j
Local value
For i=0 To 255
value=i
For j=0 To 7
If (value And $1) Then
value=(value Shr 1) Xor $EDB88320
Else
value=(value Shr 1)
EndIf
Next
CRC32_table(i)=value
Next
End Function
; Function to get CRC-32 value from a file
Function CRC32_FromFile(name$)
Local byte
Local crc
Local file
crc=$FFFFFFFF
file=ReadFile(name$)
If file=0 Then Return
While Not Eof(file)
byte=ReadByte(file)
crc=(crc Shr 8) Xor CRC32_table(byte Xor (crc And $FF))
Wend
Return ~crc
End Function |
Comments
| ||
| it seems that after so many files the CRC starts spitting out all 0's |
| ||
Also here's this same thing working in Blitzmax
Global CRC32_table[256]
CRC32_init()
Global outfile
outfile = WriteFile("patchinfo.dat")
BuildList(dir$)
CloseFile outfile
' Build list Function
Function BuildList(From_$)
Local MyDir, MyFile$
MyDir = ReadDir(From_$)
MyFile$ = NextFile$(MyDir)
MyFile$ = NextFile$(MyDir)
Repeat
MyFile$ = NextFile$(MyDir)
If MyFile$ = "" Then Exit
If FileType(From_$ + "\" + MyFile$) = 2 Then
BuildList(From_$ + "\" + MyFile$)
Else
temp$ = Replace(From_$ + "\" + MyFile$, "./\", "")
crc32% = CRC32_FromFile(temp)
Print "> CRC32 for file '" + temp + "' is " + String(Hex(crc32))
WriteLine outfile, temp + "," + String(Hex(crc32))
End If
If KeyHit(KEY_ESCAPE) Then
End
EndIf
Forever
CloseDir(MyDir)
End Function
' CRC init Function
Function CRC32_Init()
Local i
Local j
Local value
For i=0 To 255
value=i
For j=0 To 7
If (value And $1) Then
value=(value Shr 1) ~ $EDB88320
Else
value=(value Shr 1)
EndIf
Next
CRC32_table[i]=value
Next
End Function
' Function To get CRC-32 value from a file
Function CRC32_FromFile(name$)
Local Bytes
Local crc
Local file
crc=$FFFFFFFF
file=ReadFile(name$)
If file=0 Then Return
While Not Eof(file) Or KeyHit(1)
Bytes=ReadByte(file)
crc=(crc Shr 8) ~ CRC32_table(Bytes ~ (crc And $FF))
Wend
Return ~crc
End Function
|
Code Archives Forum