import zlib import sys import ctypes import datetime import struct import re import os import platform # 从文件中读取block_size大小,计算CRC32 def crc32_simple(filepath): try: with open(filepath, 'rb') as f: s = f.read(1024 * 1024) return zlib.crc32(s, 0) except Exception as e: print(str(e)) return 0 # 计算整个文件的crc32 def crc32_file(filepath): crc = 0 try: fd = open(filepath, 'rb') while True: buffer = fd.read(1024 * 1024) if len(buffer) == 0: # EOF or file empty. return hashes fd.close() if sys.version_info[0] < 3 and crc < 0: crc += 2 ** 32 return crc # 返回的是十进制的值 crc = zlib.crc32(buffer, crc) except Exception as e: if sys.version_info[0] < 3: error = unicode(e) else: error = str(e) print(error) return 0 # 根据文件大小 返回合理区间,16473740 bytes--> 15.727 MB def FormatSize(size): # 递归实现,精确为最大单位值 + 小数点后三位 def formatsize(integer, remainder, level): if integer >= 1024: remainder = integer % 1024 integer //= 1024 level += 1 return formatsize(integer, remainder, level) else: return integer, remainder, level units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'] integer, remainder, level = formatsize(size, 0, 0) if level + 1 > len(units): level = -1 return ('{}.{:>03d} {}'.format(integer, remainder, units[level])) # 转换时间 def get_time(filetime): # convert a windows FILETIME to a python datetime # https://stackoverflow.com/questions/39481221/convert-datetime-back-to-windows-64-bit-filetime WINDOWS_TICKS = int(1 / 10 ** -7) # 10,000,000 (100 nanoseconds or .1 microseconds) WINDOWS_EPOCH = datetime.datetime.strptime('1601-01-01 00:00:00', '%Y-%m-%d %H:%M:%S') POSIX_EPOCH = datetime.datetime.strptime('1970-01-01 00:00:00', '%Y-%m-%d %H:%M:%S') EPOCH_DIFF = (POSIX_EPOCH - WINDOWS_EPOCH).total_seconds() # 11644473600.0 WINDOWS_TICKS_TO_POSIX_EPOCH = EPOCH_DIFF * WINDOWS_TICKS # 116444736000000000.0 """Convert windows filetime winticks to python datetime.datetime.""" winticks = struct.unpack('