* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Aprile 19, 2024, 01:27:09 pm

Inserisci il nome utente, la password e la durata della sessione.

393 Visitatori, 0 Utenti

Autore Topic: Reperire ora ultima modifica di un file "pura"  (Letto 843 volte)

bonmario

  • Hero Member
  • *****
  • Post: 1300
  • Karma: +10/-1
Reperire ora ultima modifica di un file "pura"
« il: 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

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Reperire ora ultima modifica di un file "pura"
« Risposta #1 il: 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.
Ieri è passato, domani è futuro, oggi è un dono...

bonmario

  • Hero Member
  • *****
  • Post: 1300
  • Karma: +10/-1
Re:Reperire ora ultima modifica di un file "pura"
« Risposta #2 il: 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

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:Reperire ora ultima modifica di un file "pura"
« Risposta #3 il: 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
« Ultima modifica: Aprile 01, 2022, 02:12:56 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

bonmario

  • Hero Member
  • *****
  • Post: 1300
  • Karma: +10/-1
Re:Reperire ora ultima modifica di un file "pura"
« Risposta #4 il: 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

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:Reperire ora ultima modifica di un file "pura"
« Risposta #5 il: 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 ;)
« Ultima modifica: Aprile 01, 2022, 07:08:09 pm da nomorelogic »
Imagination is more important than knowledge (A.Einstein)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:Reperire ora ultima modifica di un file "pura"
« Risposta #6 il: 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
« Ultima modifica: Aprile 01, 2022, 07:13:43 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:Reperire ora ultima modifica di un file "pura"
« Risposta #7 il: 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 :

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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:Reperire ora ultima modifica di un file "pura"
« Risposta #8 il: 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 :)
« Ultima modifica: Aprile 01, 2022, 07:26:02 pm da nomorelogic »
Imagination is more important than knowledge (A.Einstein)

 

Recenti

How To

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18772
  • Topic in totale: 2233
  • Online Today: 578
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 393
Total: 393

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.