Skip to content

Commit babe156

Browse files
committed
Small update
1 parent 0acb414 commit babe156

File tree

1 file changed

+31
-5
lines changed

1 file changed

+31
-5
lines changed

pyneofile/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
@@ -1074,6 +1075,31 @@ def format_ns_local(ts_ns, fmt='%Y-%m-%d %H:%M:%S'):
10741075
ns_str = "%09d" % ns
10751076
return base + "." + ns_str
10761077

1078+
def get_unix_timestamp_zip(member):
1079+
extra = member.extra
1080+
i = 0
1081+
1082+
# 1. Try to find UTC Extra Fields
1083+
while i + 4 <= len(extra):
1084+
tag, length = struct.unpack('<HH', extra[i:i+4])
1085+
data = extra[i+4 : i+4+length]
1086+
1087+
# 0x5455: Info-ZIP (Unix)
1088+
if tag == 0x5455 and len(data) >= 5:
1089+
if data[0] & 1:
1090+
return struct.unpack('<I', data[1:5])[0]
1091+
1092+
# 0x000a: NTFS (Windows)
1093+
elif tag == 0x000a and len(data) >= 24:
1094+
ntfs_mtime = struct.unpack('<Q', data[8:16])[0]
1095+
return int((ntfs_mtime / 1e7) - 11644473600)
1096+
1097+
i += 4 + length
1098+
1099+
# 2. Fallback: Convert MS-DOS date_time to Unix integer
1100+
dt = datetime.datetime(*member.date_time)
1101+
return int(dt.replace(tzinfo=datetime.timezone.utc).timestamp())
1102+
10771103
def CheckSumSupport(checkfor, guaranteed=True):
10781104
if(guaranteed):
10791105
try:
@@ -6423,13 +6449,13 @@ def AppendFilesWithContentFromZipFileToList(infile, extradata=[], jsondata={}, c
64236449
else:
64246450
fsize = format(int(member.file_size), 'x').lower()
64256451
fatime = format(
6426-
int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower()
6452+
int(to_ns(get_unix_timestamp_zip(member))), 'x').lower()
64276453
fmtime = format(
6428-
int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower()
6454+
int(to_ns(get_unix_timestamp_zip(member))), 'x').lower()
64296455
fctime = format(
6430-
int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower()
6456+
int(to_ns(get_unix_timestamp_zip(member))), 'x').lower()
64316457
fbtime = format(
6432-
int(to_ns(time.mktime(member.date_time + (0, 0, -1)))), 'x').lower()
6458+
int(to_ns(get_unix_timestamp_zip(member))), 'x').lower()
64336459
if(zipinfo.create_system == 0 or zipinfo.create_system == 10):
64346460
fwinattributes = format(int(zipinfo.external_attr & 0xFFFF), 'x').lower()
64356461
if ((hasattr(member, "is_dir") and member.is_dir()) or member.filename.endswith('/')):
@@ -9471,7 +9497,7 @@ def ZipFileListFiles(infile, verbose=False, returnfp=False):
94719497
if(len(fgprint) <= 0):
94729498
fgprint = str(fgid)
94739499
VerbosePrintOut(PrintPermissionString(fmode, ftype) + " " + str(fuprint) + "/" + str(fgprint) + " " + str(member.file_size).rjust(
9474-
15) + " " + datetime.datetime.utcfromtimestamp(int(time.mktime(member.date_time + (0, 0, -1)))).strftime('%Y-%m-%d %H:%M') + " " + printfname)
9500+
15) + " " + datetime.datetime.utcfromtimestamp(int(get_unix_timestamp_zip(zipinfo))).strftime('%Y-%m-%d %H:%M') + " " + printfname)
94759501
lcfi = lcfi + 1
94769502
if(returnfp):
94779503
return listarrayfiles['fp']

0 commit comments

Comments
 (0)