[ 
https://issues.apache.org/jira/browse/COMPRESS-613?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17505926#comment-17505926
 ] 

Andre Brait commented on COMPRESS-613:
--------------------------------------

[~ggregory] 

I'd say it's unlikely. Extra fields are part of the specification.

What I can think of is this change ending up revealing bugs on how they handle 
extra fields in general, or how they parse dates from those extra fields (which 
means they do exoect those to exist and to be able to use them).

I can always add a flag or something, but I wouldn't expect it to affect them 
unless it somehow affects them when opening zips packaged by other tools as 
well (including WinZip, java.util.zip classes, etc.).

> Write ZIP extra time fields automatically
> -----------------------------------------
>
>                 Key: COMPRESS-613
>                 URL: https://issues.apache.org/jira/browse/COMPRESS-613
>             Project: Commons Compress
>          Issue Type: Improvement
>          Components: Archivers
>    Affects Versions: 1.21
>            Reporter: Andre Brait
>            Priority: Major
>              Labels: zip
>
> When writing to a Zip file through ZipArchiveOutputStream, setting creation 
> and access times in a ZipArchiveEntry does not cause these to be reflected as 
> X5455 or X000A extra fields in the resulting zip file. This also happens for 
> modification times that do not fit into an MS-DOS time.
> As a consequence, the date range is reduced, as well as the granularity (form 
> 100ns intervals to seconds).
> ZipEntry and standard java.util.zip facilities do that automatically, but 
> that's missing here.
> My proposal is to use the same logic the java.util.zip do and add those extra 
> fields automatically, if situation requires them.
> See my existing logic for this here: 
> [https://github.com/andrebrait/DATROMTool/blob/86a4f4978bab250ca54d047c58b4f91e7dbbcc7f/core/src/main/java/io/github/datromtool/io/FileCopier.java#L1425]
> It's (almost) the same logic from java.util.zip, but adapted to be used with 
> ZipArchiveEntry.
> If you're ok with it, I can send a PR.
> Actual logic will be more like 
> {{{}java.util.zip.ZipOutputStream#writeLOC(XEntry){}}}, represented below:
> {code:java}
>         int elenEXTT = 0;         // info-zip extended timestamp
>         int flagEXTT = 0;
>         long umtime = -1;
>         long uatime = -1;
>         long uctime = -1;
>         if (e.mtime != null) {
>             elenEXTT += 4;
>             flagEXTT |= EXTT_FLAG_LMT;
>             umtime = fileTimeToUnixTime(e.mtime);
>         }
>         if (e.atime != null) {
>             elenEXTT += 4;
>             flagEXTT |= EXTT_FLAG_LAT;
>             uatime = fileTimeToUnixTime(e.atime);
>         }
>         if (e.ctime != null) {
>             elenEXTT += 4;
>             flagEXTT |= EXTT_FLAT_CT;
>             uctime = fileTimeToUnixTime(e.ctime);
>         }
>         if (flagEXTT != 0) {
>             // to use ntfs time if any m/a/ctime is beyond unixtime upper 
> bound
>             if (umtime > UPPER_UNIXTIME_BOUND ||
>                 uatime > UPPER_UNIXTIME_BOUND ||
>                 uctime > UPPER_UNIXTIME_BOUND) {
>                 elen += 36;                // NTFS time, total 36 bytes
>             } else {
>                 elen += (elenEXTT + 5);    // headid(2) + size(2) + flag(1) + 
> data
>             }
>         }
>         writeShort(elen);
>         writeBytes(nameBytes, 0, nameBytes.length);
>         if (hasZip64) {
>             writeShort(ZIP64_EXTID);
>             writeShort(16);
>             writeLong(e.size);
>             writeLong(e.csize);
>         }
>         if (flagEXTT != 0) {
>             if (umtime > UPPER_UNIXTIME_BOUND ||
>                 uatime > UPPER_UNIXTIME_BOUND ||
>                 uctime > UPPER_UNIXTIME_BOUND) {
>                 writeShort(EXTID_NTFS);    // id
>                 writeShort(32);            // data size
>                 writeInt(0);               // reserved
>                 writeShort(0x0001);        // NTFS attr tag
>                 writeShort(24);
>                 writeLong(e.mtime == null ? WINDOWS_TIME_NOT_AVAILABLE
>                                           : fileTimeToWinTime(e.mtime));
>                 writeLong(e.atime == null ? WINDOWS_TIME_NOT_AVAILABLE
>                                           : fileTimeToWinTime(e.atime));
>                 writeLong(e.ctime == null ? WINDOWS_TIME_NOT_AVAILABLE
>                                           : fileTimeToWinTime(e.ctime));
>             } else {
>                 writeShort(EXTID_EXTT);
>                 writeShort(elenEXTT + 1);  // flag + data
>                 writeByte(flagEXTT);
>                 if (e.mtime != null)
>                     writeInt(umtime);
>                 if (e.atime != null)
>                     writeInt(uatime);
>                 if (e.ctime != null)
>                     writeInt(uctime);
>             }
>         }
>         writeExtra(e.extra);
>         locoff = written;
> {code}



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to