TZipFile vs TAbUnZipper

di il
10 risposte

TZipFile vs TAbUnZipper

Ciao,

sto valutando se utilizzare TZipFile oppure TAbUnZipper/TAbZipper per gestire files ZIP. Preferirei TZipFile in quanto nativo, ma mi trovo con un'inconsistenza riguardo all'ora dell'ultima modifica di alcuni files.

Decomprimendo lo stesso file Zip con Windows, TZipFile e TAbUnZipper (Abbrevia) ottengo 193 files non compressi, dei cui 138 con proprietà identiche e 55 dove l'ora dell'ultima modifica dell'output di TZipFile è +1 confronto Abbrevia e Windows. Esempio:

  • File decompresso con Windows: 10/01/2023 18:17
  • File decompresso con TZipFile: 10/01/2023 19:17
  • File decompresso con TAbUnZipper: 10/01/2023 18:17

Di seguito il codice utilizzato per la decompressione con TZipFile:

begin
  ZipFile := TZipFile.Create;
  try
    ZipFile.ExtractZipFile(SourceFile, DestinationPath);
  finally
    ZipFile.Free;
  end;
end;

È possibile influire su TZipFile in modo che la data sia in linea con quella generata da Windows e TAbUnZipper?

Mille grazie, Ale

10 Risposte

  • Re: TZipFile vs TAbUnZipper

    In compressione si verifica cosa analoga. Su 193 files compressi, 138 hanno proprietà identiche con i files originali decompressi, nei restanti 55 l'ora dell'ultima modifica dell'output di TZipFile è -1 confronto Abbrevia e Windows. Esempio:

    • File compresso con Windows: 10/01/2023 18:17
    • File compresso con TZipFile: 10/01/2023 17:17
    • File compresso con TAbZipper: 10/01/2023 18:17

    Di seguito il codice utilizzato per la compressione con TZipFile:

    begin
      ZipFile := TZipFile.Create;
      try
        ZipFile.ZipDirectoryContents(DestinationFile, SourcePath);
      finally
        ZipFile.Free;
      end;
    end;

    Ale

  • Re: TZipFile vs TAbUnZipper

    Hai provato a ispezionare le proprietà del file che vengono generate nel contesto dell'evento OnProgress (vedi documentazione)?

  • Re: TZipFile vs TAbUnZipper

    Buongiorno Alka,

    elencando le proprietà di ciascun file con OnProgress risulta che la data di ultima modifica passata con Header.ModifiedDateTime.ToString è di tipo Cardinal.

    Di seguito le proprietà Windows di un file decompresso con Abbrevia e [TZipFile]:

    • FileName: 92audtrsll9x037k058klf1g5ua46s94
    • Size: 1.045.785
    • LastModified: 10/01/2023 16:31 [17:31]

    Le proprietà OnProgress di questo file sono:

    • FileName: 92audtrsll9x037k058klf1g5ua46s94
    • Size: 1.045.785
    • LastModified: 1445626852

    Purtroppo non ho trovato il modo di convertire il valore LastModified Cardinal in DateTime.

    Ale

  • Re: TZipFile vs TAbUnZipper

    08/04/2024 - al.delphi ha scritto:


    Di seguito le proprietà Windows di un file decompresso con Abbrevia e [TZipFile]

    Credo che la problematica sia dovuta a un problema insito nel formato ZIP in sé, che non salva nativamente la timezone di riferimento.

    Provo a spiegare.

    Da quello che ho potuto leggere dalla documentazione del formato, la data di creazione e ultima modifica è salvata nello ZIP con un formato numerico intero (che è il classico formato UNIX), così come hai potuto vedere.

    Tale valore può essere convertito in data/ora, ma non contiene in sé una informazione relativa alla “timezone”, ossia non è indicato - salvo specificarlo da qualche parte - se si tratta di una data/ora UTC, oppure se espressa con GMT+0 o un altro riferimento.

    Se apri lo ZIP in Windows, credo che aggiunga un'ora per via delle impostazioni internazionali e rimuove quell'ora quando si crea lo ZIP; tuttavia, questa valutazione è arbitraria, nel senso che modificando la timezone nel Pannello di Controllo, probabilmente otterrai una visualizzazione di un'ora diversa (se l'archivio è stato creato con un'altra timezone).

    Se apri l'archivio con 7-zip, troverai una situazione ancora diversa. Infatti, alcuni lamentano che non gestisce l'ora legale. L'output mostrato è effettivamente lo stesso che si ottiene con la classe TZipFile di Delphi.

    In breve, la data/ora credo si possa garantire se la creazione dell'archivio e la sua estrazione vengono fatti dal medesimo “pezzo di software”. In caso contrario, è necessario entrare nel merito di come ogni gestore del formato valuta la zona temporale di riferimento della data/ora che viene caricata dall'header del file ZIP.

    Temo che le implementazioni alternative di TZipFile che hai usato adottino solo incidentalmente le stesse convenzioni di Windows, ma potrebbero cambiare un domani (ad esempio, se non siamo più in regime di ora legale). Sarebbe da provare.

    Dal mio punto di vista, se queste premesse sono effettive, la data/ora di creazione e/o ultima modifica caricata dallo ZIP è una informazione sulla quale non si può fare affidamento se questo valore temporale costituisce una rilevanza specifica e sensibile nella logica applicativa.

  • Re: TZipFile vs TAbUnZipper

    A corredo di quanto indicato nel precedente messaggio, segnalo anche questo articolo (vedi la sezione “Gotchas”, che parla espressamente del problema).

  • Re: TZipFile vs TAbUnZipper

    Grazie mille per la tua risposta, Alka.

    Continuerò quindi con TZipFile, in quanto nativo, e mi farò un promemoria, in caso l'ora del file dovesse creare problemi in uno specifico processo.

    Ciao, Ale

  • Re: TZipFile vs TAbUnZipper

    Ciao Alka,

    aggiungo qui un'altra osservazione, scollegata dall'argomento iniziale ma combaciando con il titolo del post “TZipFile vs TAbUnZipper” in quanto i due componenti si comportano diversamente riguardo lo stesso file zip.

    Devo processare dei files compressi denominati "project.zip" che contengono un solo file con nome “project”. In apertura di un file “project.zip” si manifestano i seguenti comportamenti:

    • Ok: PKUnzip apre lo zip e visualizza il file di testo contenuto con nome “project”.
    • Ok: In Delphi, TAbUnZipper apre lo zip e visualizza il file di testo contenuto con nome “unknown”.
    • Ok: Il sito products.groupdocs.app apre lo zip e permette il download del contenuto come file *.txt.
    • Err: Windows 10 non apre lo zip dando l'errore “La cartella compressa non è valida". Il comando “Estrai tutto” del menu selezionato dice “La cartella compressa è vuota”. Da Prompt dei comandi (CMD), inserendo [c:\for %i in (…\project.zip) do tar -xf “%i”] da l'errore “Unrecognized archive format”.
    • Err: In Delphi, TZipFile non apre lo zip dando l'errore “Error reading zip file”.

    .

    Pare che il metodo di de-/compressione implementato in Windows 10 non riesca gestire quel particolare formato zip. Infatti, scompattando il file “project.zip” con PKUnzip e ricompattandolo con PKZip, Windows 10 e TZipFile lo aprono correttamente.

    Nella mia app sono quindi costretto di utilizzare TAbUnZipper. Ma in generale, quando si crea un applicativo Delphi che apre files zip con TZipFile, converrebbe sempre implementare una subroutine che, in caso di errore, chiama TAbUnZipper, aumentando così la possibilità che un file zip venga aperto correttamente?

    Ale

  • Re: TZipFile vs TAbUnZipper

    18/04/2024 - al.delphi ha scritto:


    Nella mia app sono quindi costretto di utilizzare TAbUnZipper. Ma in generale, quando si crea un applicativo Delphi che apre files zip con TZipFile, converrebbe sempre implementare una subroutine che, in caso di errore, chiama TAbUnZipper, aumentando così la possibilità che un file zip venga aperto correttamente?

    A mio avviso, qui il problema è un altro: non si tratta evidentemente di un file ZIP, o in alternativa è un file ZIP che contiene degli errori.

    Poco importa se una libreria riesce nell'estrazione, poiché prima bisogna risalire alla fonte del problema e porsi diverse domande: si sta chiamando come ZIP un file che in realtà è in un altro formato? c'è una procedura software esterna che lo sta generando in modo formalmente errato? tutti i file presentano lo stesso difetto o potenzialmente possono averne altri? chi ci assicura che, pur se una estrazione corretta della libreria che funziona va a buon fine, ciò avvenga anche per quelle successive, se il file che trattiamo presenta errori formali di cui disconosciamo la causa?

  • Re: TZipFile vs TAbUnZipper

    I files compressi vengono creati da un'app di terze parti e negli ultimi anni tutti questi files hanno la medesima caratteristica/anomalia che TAbUnZipper riesce gestire (pur in mal modo visto che cambia il nome del file compresso in “unknown”) mentre TZipFile fallisce.

    L'incertezza, mi pare di aver capito, è un fedele compagno del programmatore. : ))

    Ale

  • Re: TZipFile vs TAbUnZipper

    26/04/2024 - al.delphi ha scritto:


    I files compressi vengono creati da un'app di terze parti e negli ultimi anni tutti questi files hanno la medesima caratteristica/anomalia che TAbUnZipper riesce gestire (pur in mal modo visto che cambia il nome del file compresso in “unknown”) mentre TZipFile fallisce.

    Evidentemente, questa app di terze parti fallisce nel rispetto del formato standard dello ZIP.

    26/04/2024 - al.delphi ha scritto:


    L'incertezza, mi pare di aver capito, è un fedele compagno del programmatore. : ))

    Questo è sicuro. Attenzione che non sarebbe la prima volta (nella mia esperienza almeno) che una libreria viene magari aggiornata e migliorata per verificare l'adesione formale di file a uno specifico standard, e rispetto al passato inizia a segnalare errori che prima non venivano sollevati, a causa di un controllo mancante nelle versioni precedenti che, aggiunto nella nuova, evidenzia una problematica che già c'era prima al di fuori della libreria, ma che fino a quel momento non veniva rilevato né segnalato.

Devi accedere o registrarti per scrivere nel forum
10 risposte