Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: bonmario - Aprile 01, 2022, 11:23:52 am

Titolo: Reperire ora ultima modifica di un file "pura"
Inserito da: bonmario - Aprile 01, 2022, 11:23:52 am
Ciao a tutti,
scusate l'oggetto "strano", ma era davvero difficile sintetizzare !!!

Ho un programma che serve per sincronizzare una directory in locale, con le sue copie dislocate in vari dischi di rete.
Nello specifico, questo programma fa un elenco dei files presenti in una certa directory e, per ogni file, fa questo:
- verifica se la copia del file presente nella directory di rete (una alla volta), ha una data di ultima modifica inferiore rispetto a quella del file in locale
- se è così, significa che quel file non è aggiornato, quindi lo copio dalla directory locale a quella di rete

Questo programma funziona bene, ma per 363 giorni all'anno (364 negli anni bisestili), ma purtroppo "sballa" il primo lunedì seguente al cambio dell'ora ...
Il problema, da quello che ho capito, è che l'orario che leggo può essere influenzato da vari fattori, e che non è quello "puro", indipendente cioè da ora legale/solare, fuso orario ecc.

E' da anni che cerco di trovare una soluzione, ma non ho ancora trovato un modo che faccia funzionare bene il programma tutti i giorni dell'anno, compreso il giorno in cui l'orario va avanti di un'ora e quello in cui va indietro.

Quest'anno, pensavo di aver finalmente risolto dopo aver letto questo https://it.wikipedia.org/wiki/Ora_legale ma ho avuto il solito problema questo lunedì !!!

Qualcuno di voi si è già imbattuto in questa problematica e sa come risolvere?

Grazie, Mario
Titolo: Re:Reperire ora ultima modifica di un file "pura"
Inserito da: xinyiman - Aprile 01, 2022, 12:54:47 pm
Non basarti sull'orario di modifica. Fai un hash del file e basati su quello. Poi ti tieni gli hash in un database e fai il confronto.

Così risolvi sicuramente.
Titolo: Re:Reperire ora ultima modifica di un file "pura"
Inserito da: bonmario - Aprile 01, 2022, 01:28:36 pm
Quella sarebbe l'ultima alternativa .... i files in questione sono parecchi, ed alcuni anche tra il giga ed i 2 giga.
Mi baso sull'orario, proprio per evitare di leggere tutto il file, visto che quando mi rendo conto di dover fare la copia, prima copio il file, e poi verifico che il file di partenza e quello di arrivo siano identici.

Se non trovo alternative, passerò a quello che consigli tu, ma al momento preferirei vedere se riesco a risolvere il problema.

Grazie, Mario
Titolo: Re:Reperire ora ultima modifica di un file "pura"
Inserito da: DragoRosso - Aprile 01, 2022, 02:03:09 pm
Il problema dell'ora legale / solare esiste ed esisterà sempre in quanto è un artificio che fà collimare in maniera non distinguibile diverse date (orari).

La soluzione è usare l'ora UTC, ossia l'orario universale. Tale ora è univoca in tutti il globo e quindi consente di marcare in maniera univoca un qualsiasi oggetto / evento (eccezion fatta durante l'ora di cambio legale / solare e viceversa).

Windows (come penso anche altri SO) ha nelle sue utility la gestione del DST (DayLigth Saivng Time) automatica, e dovrebbe tenere conto di ciò nelle conversioni UTC. Potrebbe essere un problema se un FILE è stato "marcato" dopo un cambio di ora ma il PC non ha ancora adottato il cambio stesso per vari motivi (al giorno d'oggi non dovrebbe accadere).

Se usi le utility DATETIME di sistema, dovresti avere l'ora UTC corretta (torno a ripetere eccetto nell'ora di cambio, quindi dalle 2 alle 3 della domenica di cambio ora in Italia).

Ovviamente ciò vale se i file sono in Italia e con il PC o server che segue il DST, perchè se usassi le funzioni per file ad esempio nei CLOUD all'estero .... allora si ci sarebbero problemi.

Ti posterò un esempio ....

PS: occhio che data/ora del file originale e quello copiato non coincidono, e che nel caso di file molto grandi tale discordanza potrebbe essere importante. Ulteriormente, durante la copia (a meno che non usi le funzioni di backup di sistema operativo) il file originale non può essere modificato. E anche se potesse essere, ti troveresti con un file aggiornato originale che avrebbe la data più vecchia della tua copia ... situazione discordante.
E ultimissima cosa: l'orario del PC di origine e del PC di destinazione dovrebbe essere sincronizzato.
 
Ciao
Titolo: Re:Reperire ora ultima modifica di un file "pura"
Inserito da: bonmario - Aprile 01, 2022, 06:32:45 pm
Ok, grazie ...
Dovrei già gestire la conversione da UTC usando il DST, ma sempre meglio provare nuove soluzioni !!!

In quello che hai scritto, mi hai però fatto venire in mente una cosa: io i files li copio in quelle che per me sono directory di rete, ma non so cosa "c'è sotto". Potrebbero anche essere server configurati in maniera diversa, e per quello poi nei giorni successivi al cambio dell'ora va a farsi benedire il tutto.

Per quanto riguarda invece gli altri discorsi, questo programma gira in momenti ben definiti, in cui nessuno può modificare i "files di partenza", quindi almeno quel problema non lo devo gestire.

Ciao, Mario
Titolo: Re:Reperire ora ultima modifica di un file "pura"
Inserito da: nomorelogic - Aprile 01, 2022, 07:00:06 pm
hai pensato di usare rsync con l'opzione -c?

con -c fa esattamente quello che dice xinyiman e cioè un controllo con il checksum
in più con rsync hai una copia differenziale, non so se hai a che fare con file di grandi dimensioni ma ti assicuro che l'algoritmo di rsync fa la differenza sia su grandi file che su copie remote

Edit:
dovresti installarlo anche sui vari server dove sono montati i dischi di rete, non so se è fattibile
ma una prova ti consiglio di farla, ti risolve tutti i problemi ;)
Titolo: Re:Reperire ora ultima modifica di un file "pura"
Inserito da: DragoRosso - Aprile 01, 2022, 07:03:41 pm
Infatti, una delle problematiche riguardo al funzionamento delle reti, in particolare alla "registrazione" dei dati di SO dei file è che il dato del file è un dato locale, lo conosce il "server", cioè chi ha scritto fisicamente il dato.

Se il tuo programma, che gira su un PC Italiano, và a scrivere su un server configurato come "Americano" (nel senso che il DST è Americano) Data / Ora e tutti gli altri dati saranno "AMERICANI" (e ciò è conforme, perchè anche se il DST non è Italiano, l'UTC è comunque corretto). Il problema è la lettura, in quanto il tuo programma Italiano quando legge pensa di leggere un file "ITALIANO" e invece legge un file "Americano" e quindi l'ora è completamente sbagliata.

Questo è palese e te ne accorgi perchè ovviamente il problema è persistente. Lo stesso identico problema te lo trovi se il "server" non cambia l'ora secondo lo standard DST (ad esempio c'è un cambio manuale o posticipato a seguito di impostazioni dell'amministratore). Quest'ultima situazione genera problemi nell'immediatezza del cambio DST, come succede a te.

L'altra situazione invece è che il calcolo del DATE/TIME del file non venga effettuato dal sistema operativo ma da qualche altra routine "strana" che potrebbe proprio sbagliare con il DST.

Il problema del DATE/TIME è solo uno dei problemi con cui si ha a che fare quando si parla di file in rete o comunque di sistemi in rete e i formati internazionali. Ancora oggi mi trovo con applicazioni che non gestiscono correttamente i formati numerici ad esempio (scambiano i '.' con le ',' creando non pochi problemi.
Una nota casa di processori, la più nota ..., ha una sua utility per la verifica, il setting e l'ottimizzazione dei parametri dei suoi processori. Peccato che in una delle opzioni, volendo variare una tensione di 0,015 Volt (vista corretta) la cambiava in 15 Volt perchè nonostante la virgola correttamente visualizzata, lui internamente faceva i calcoli con i '.' .......

Ciao
Titolo: Re:Reperire ora ultima modifica di un file "pura"
Inserito da: DragoRosso - Aprile 01, 2022, 07:07:50 pm
hai pensato di usare rsync con l'opzione -c?

con -c fa esattamente quello che dice xinyiman e cioè un controllo con il checksum
in più con rsync hai una copia differenziale, non so se hai a che fare con file di grandi dimensioni ma ti assicuro che l'algoritmo di rsync fa la differenza sia su grandi file che su copie remote

Da Wikipedia https://it.wikipedia.org/wiki/Rsync (https://it.wikipedia.org/wiki/Rsync) :

Citazione
Tuttavia, va notato che si possono verificare dei piccoli problemi usando rsync fra macchine con diversi sistemi operativi, in particolare per quanto riguarda le date di modifica dei file, l'accuratezza con cui vengono trasmesse alcune informazioni ausiliarie sui file (proprietario, diritti, ecc.) e le possibili ambiguità fra nomi di file in maiuscolo e minuscolo su Windows.

 :o :o :o
Titolo: Re:Reperire ora ultima modifica di un file "pura"
Inserito da: nomorelogic - Aprile 01, 2022, 07:13:26 pm
l'opzione -c serve appunto ad evitare i problemi tra le date dei vari OS dislocati nel mondo

Le ambiguità sui nomi dei file dipendono dal fatto che sotto *NIX si usa UTF8 mentre su Win i nomi dei file sono in ISO 8859.
Si risolve passando il parametro --iconv=iso8859-1,utf-8

se usi rsync tra 2 OS uguali questi problemi non ci sono
se i nomi dei file non hanno cose strane tipo lettere accentate e cose del genere, i problemi non ci sono neanche tra diversi OS

Edit:
relativamente ai permessi, penso sia logico capire che quì si apre un capitolo a parte...
con rsync è possibile (tentare di) trasferire anche i permessi dei singoli file dalla sorgente alla destinazione
stiamo parlando di server remoti dove gli OS ed utenti probabilmente non sono neanche gli stessi :)