Wanna try it out? Point main.py to a directory.
Required:
- wxpython (python 3.11.4 works well with wxpython 4.2.1)
import os, sys, re | |
import binascii as checksum | |
def get_crc32(filename): | |
crc32 = 0 | |
binaryfile = open(filename, "rb") | |
while True: | |
chunk = binaryfile.read(1000000) | |
if chunk != b"": | |
crc32 = checksum.crc32(chunk, crc32) | |
else: break | |
return "%08X" % crc32 | |
def scan(dir): | |
dirlist = os.listdir(dir) | |
result = [] | |
checksum_pattern = "\[[A-F0-9]{8}\]" | |
for file in dirlist: | |
match = re.search(checksum_pattern, file) | |
if match: | |
crc32 = get_crc32(dir + "\\" + file) | |
if match[0][1:-1] == crc32: | |
status = True | |
else: | |
status = False | |
result.append({ | |
"good": status, | |
"sum": crc32, | |
"file": file | |
}) | |
return result | |
if __name__ == "__main__": | |
if len(sys.argv)-1 == 1: | |
print("CRC32", get_crc32(sys.argv[1])) |
import os, sys | |
import wx | |
import crc32 | |
class CRC32ScanWindow(wx.Frame): | |
def __init__(self, parent, title, filepath): | |
super(CRC32ScanWindow, self).__init__(parent, title=title, size=(500, 300)) | |
panel = wx.Panel(self) | |
vbox = wx.BoxSizer(wx.VERTICAL) | |
self.list_ctrl = wx.ListCtrl(panel, style=wx.LC_REPORT) | |
self.list_ctrl.InsertColumn(0, 'File Name', width=300) | |
self.list_ctrl.InsertColumn(1, 'CRC32', width=100) | |
self.list_ctrl.InsertColumn(2, 'Status', width=100) | |
vbox.Add(self.list_ctrl, proportion=1, flag=wx.EXPAND | wx.ALL, border=5) | |
panel.SetSizer(vbox) | |
self.list_ctrl.Bind(wx.EVT_LEFT_DCLICK, self.OnDoubleClick) | |
self.Center() | |
busy = wx.BusyInfo("Please wait, scanning...") | |
wx.Yield() | |
results = crc32.scan(filepath) | |
for result in results: | |
index = self.list_ctrl.InsertItem(self.list_ctrl.GetItemCount(), result['file']) | |
self.list_ctrl.SetItem(index, column=1, label=result['sum']) | |
self.list_ctrl.SetItem(index, column=2, label="Good" if result['good'] else "Bad") | |
busy = None | |
self.Show(True) | |
def OnDoubleClick(self, event): | |
pos = event.GetPosition() | |
index, _ = self.list_ctrl.HitTest(pos) | |
column = self.GetColumnFromPosition(pos) | |
if index != wx.NOT_FOUND and column != wx.NOT_FOUND: | |
value = self.list_ctrl.GetItem(index, column).GetText() | |
clipboard = wx.Clipboard.Get() | |
clipboard.Open() | |
clipboard.SetData(wx.TextDataObject(value)) | |
clipboard.Close() | |
wx.MessageBox(f"Value copied: {value}", "Copied", wx.OK | wx.ICON_INFORMATION) | |
def GetColumnFromPosition(self, pos): | |
x, _ = pos | |
width_accumulator = 0 | |
for col in range(self.list_ctrl.GetColumnCount()): | |
width = self.list_ctrl.GetColumnWidth(col) | |
if x >= width_accumulator and x < width_accumulator + width: | |
return col | |
width_accumulator += width | |
return None | |
def show_crc32_scan_window(filepath): | |
app = wx.App() | |
frame = CRC32ScanWindow(None, 'CRC32 Scan', filepath) | |
app.MainLoop() | |
if __name__ == "__main__": | |
if len(sys.argv)-1 == 1: | |
show_crc32_scan_window(sys.argv[1]) |