Skip to content

Commit 95c6087

Browse files
committed
Small update
1 parent c63e45e commit 95c6087

1 file changed

Lines changed: 31 additions & 5 deletions

File tree

pyfoxfile/pyfile.py

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import atexit
2929
import shutil
3030
import base64
31+
import struct
3132
import logging
3233
import zipfile
3334
import platform
@@ -1081,6 +1082,31 @@ def format_ns_local(ts_ns, fmt='%Y-%m-%d %H:%M:%S'):
10811082
ns_str = "%09d" % ns
10821083
return base + "." + ns_str
10831084

1085+
def get_unix_timestamp_zip(member):
1086+
extra = member.extra
1087+
i = 0
1088+
1089+
# 1. Try to find UTC Extra Fields
1090+
while i + 4 <= len(extra):
1091+
tag, length = struct.unpack('<HH', extra[i:i+4])
1092+
data = extra[i+4 : i+4+length]
1093+
1094+
# 0x5455: Info-ZIP (Unix)
1095+
if tag == 0x5455 and len(data) >= 5:
1096+
if data[0] & 1:
1097+
return struct.unpack('<I', data[1:5])[0]
1098+
1099+
# 0x000a: NTFS (Windows)
1100+
elif tag == 0x000a and len(data) >= 24:
1101+
ntfs_mtime = struct.unpack('<Q', data[8:16])[0]
1102+
return int((ntfs_mtime / 1e7) - 11644473600)
1103+
1104+
i += 4 + length
1105+
1106+
# 2. Fallback: Convert MS-DOS date_time to Unix integer
1107+
dt = datetime.datetime(*member.date_time)
1108+
return int(dt.replace(tzinfo=datetime.timezone.utc).timestamp())
1109+
10841110
def CheckSumSupport(checkfor, guaranteed=True):
10851111
if(guaranteed):
10861112
try:
@@ -6430,13 +6456,13 @@ def AppendFilesWithContentFromZipFileToList(infile, extradata=[], jsondata={}, c
64306456
else:
64316457
fsize = format(int(member.file_size), 'x').lower()
64326458
fatime = format(
6433-
int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower()
6459+
int(to_ns(get_unix_timestamp_zip(member))), 'x').lower()
64346460
fmtime = format(
6435-
int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower()
6461+
int(to_ns(get_unix_timestamp_zip(member))), 'x').lower()
64366462
fctime = format(
6437-
int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower()
6463+
int(to_ns(get_unix_timestamp_zip(member))), 'x').lower()
64386464
fbtime = format(
6439-
int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower()
6465+
int(to_ns(get_unix_timestamp_zip(member))), 'x').lower()
64406466
if(zipinfo.create_system == 0 or zipinfo.create_system == 10):
64416467
fwinattributes = format(int(zipinfo.external_attr & 0xFFFF), 'x').lower()
64426468
if ((hasattr(member, "is_dir") and member.is_dir()) or member.filename.endswith('/')):
@@ -9478,7 +9504,7 @@ def ZipFileListFiles(infile, verbose=False, returnfp=False):
94789504
if(len(fgprint) <= 0):
94799505
fgprint = str(fgid)
94809506
VerbosePrintOut(PrintPermissionString(fmode, ftype) + " " + str(fuprint) + "/" + str(fgprint) + " " + str(member.file_size).rjust(
9481-
15) + " " + datetime.datetime.utcfromtimestamp(int(time.mktime(member.date_time + (0, 0, -1)))).strftime('%Y-%m-%d %H:%M') + " " + printfname)
9507+
15) + " " + datetime.datetime.utcfromtimestamp(int(get_unix_timestamp_zip(zipinfo))).strftime('%Y-%m-%d %H:%M') + " " + printfname)
94829508
lcfi = lcfi + 1
94839509
if(returnfp):
94849510
return listarrayfiles['fp']

0 commit comments

Comments
 (0)