EVITARE DI LEGGERE LO STESSO FILE IN UNA CARTELLA

di il
17 risposte

EVITARE DI LEGGERE LO STESSO FILE IN UNA CARTELLA

Buongiorno ragazzi,
ho un problema cui non riesco a trovare una soluzione.
Ho sviluppato un programma che legge il contenuto di file creati da un rilevatore di presenze orario (Badge).
I dipendenti ogni volta che timbrano, il rilevatore crea un file che io leggo tramite programma e inserisce i dati su mysql.
Il problema che i file sono tanti e voglio evitare di leggere ogni volta gli stessi ma vorrei leggere solo l'ultimo creato.
Ho provato a creare un file di log con tutti i file letti oppure tramite data creazione ma comunque deve sempre verificarli uno ad uno.
Si accettano idee
Grazie in anticipo vubiniani!

17 Risposte

  • Re: EVITARE DI LEGGERE LO STESSO FILE IN UNA CARTELLA

    Rinomini il file (non dovrebbe essere un problema ricrearlo per il programma che gestisce il rilevatore)
    Se la rinomina riesce ne gestisci il contenuto
    e poi casomai lo sposti anche in un'altra cartella
  • Re: EVITARE DI LEGGERE LO STESSO FILE IN UNA CARTELLA

    Ci avevo pensato ma il boss non vuole che si spostino i file dalla cartella.....
  • Re: EVITARE DI LEGGERE LO STESSO FILE IN UNA CARTELLA

    Potresti provare a leggere solo i file nuovi usando la classe filesystemwatcher di .net , dovresti poter analizzare un file solo quando è nuovo

    >>>Ho provato a creare un file di log con tutti i file letti oppure tramite data creazione ma comunque deve sempre verificarli uno ad uno.
    verificarli uno ad uno ... in realtà lo fà il computer e molto velocemente se stai usando le librerie .net a meno che si parli di migliaia e migliaia di file

    se puoi fai sapere com'è andata
  • Re: EVITARE DI LEGGERE LO STESSO FILE IN UNA CARTELLA

    Ok, ci provo e vi farò sapere...
    al momento grazie vubiniani!!!
  • Re: EVITARE DI LEGGERE LO STESSO FILE IN UNA CARTELLA

    Un'alternativa che funziona ANCHE se il programma si ferma e lo fai ripartire e' tenere traccia dei file gia' letti, nel database oppure nella directory in cui ci sono i file che stai leggendo.
    Altro giochino e' giocare con il timestamp: leggi SOLO i file piu' recenti di un certo orario
  • Re: EVITARE DI LEGGERE LO STESSO FILE IN UNA CARTELLA

    Giangi1969 ha scritto:


    Ci avevo pensato ma il boss non vuole che si spostino i file dalla cartella.....
    ???
    allora rinominali nuovamente anche dopo aver salvato nel db.
    Esempio :
    Timbrature.DAT
    Timbrature.DAFARE (lo leggi e salvi nel db)
    Timbrature.FATTO (te lo sei tolto dai @@)

    Cosi non ti perdi nulla;
    devi solo avere cura di non inserire più volte la stessa timbratura nel db.

    HTH
  • Re: EVITARE DI LEGGERE LO STESSO FILE IN UNA CARTELLA

    @sspintux: non funziona!
    NON E' durante la corrente elaborazione, il problema, ma nelle elaborazioni SUCCESSIVE, fatte un'ora dopo o il giorno dopo
  • Re: EVITARE DI LEGGERE LO STESSO FILE IN UNA CARTELLA

    migliorabile ha scritto:


    @sspintux: non funziona!
    perchè dici di no :
    supponi di avere i seguenti file :
    TIMBRATURE.DAT ( scritto dal lettore di badge)
    TIMBRATURE.DAFARE ( rimasto appeso dalla precedente procedura di elaborazione)

    Quello che il programma può fare è :

    1) Rinomina TIMBRATURE.DAT in TIMBRATURE.DAFARE (continua se fallisce)
    2) Leggi TIMBRATURE.DAFARE ed alla fine (dopo averlo salvato su DB) rinominalo (per esempio in TIMBRATURE_<timestamp>.FATTO)
    ...e ricomincia il giro

    Volendo elaboarre prima eventuali file *.DAFARE rimasti appesi potrebbe anche fare :
    1) Leggi TIMBRATURE.DAFARE ed alla fine (dopo averlo salvato su DB) rinominalo (per esempio in TIMBRATURE_<timestamp>.FATTO)
    2) Rinomina TIMBRATURE.DAT in TIMBRATURE.DAFARE
    3) fai nuovamente 1)
    ... e ricomincia il giro

    A me sembra che funzioni anche se ci sono sono più file *.DAT senza perderti nulla


    MI sfugge qualcosa ?
  • Re: EVITARE DI LEGGERE LO STESSO FILE IN UNA CARTELLA

    Parto dall'ipotesi che se il capo non vuole che vengano spostati, men che meno vorra' che gli venga cambiato il nome.

    Il giochino del timestamp e' piu' conservativo e fa lo stesso lavoro del tuo approccio:

    1) ordini i file per timestamp (dal piu' vecchio al piu' recente)
    2) processi i file piu' vecchi e se l'esecuzione termina con successo, aggiorni il timestamp
  • Re: EVITARE DI LEGGERE LO STESSO FILE IN UNA CARTELLA

    Il mio consiglio è 'marcare' i file 'letti' aggiungendo tilde seguito da un progressivo in testa al nome, così trovi 'prima' i file nuovi e dopo i file 'vecchi' ordinati.

    Un'altra alternativa è una sotto-cartella in cui sposti i file vecchi
  • Re: EVITARE DI LEGGERE LO STESSO FILE IN UNA CARTELLA

    La soluzione più affidabile è quella di mantenere, nel dbmysql, l'hash del file elaborato e la dimensione, applicando un indice composto (dimensione+hash).

    Utilizzando anche il normalissimo md5 (in realtà andrebbe bene perfino CRC32).

    A questo punto durante l'elaborazione prenderai ogni singolo file, vedrai se la dimensione esiste già nel db, nel qual caso confronterai l'hash con quello memorizzato. se è uguale, lo scarti, altrimenti lo lavori.

    approcci su timestamp nomi etc non sono altrettanto sicuri nel discriminare i duplicati.

    Se poi vuoi divertirti puoi scrivere una pre-funzionehash, che calcoli l'hash dei primi X byte giustapposti agli ultimi X del file.

    Quindi avrai un triplo controllo
    dimensione
    hash breve
    hash intero

    lo scopo è ovviamente calcolare l'hash intero solo nel caso peggiore. qualora i file siano piccoli, e si usino dischi magnetici, tipicamente conviene non usare gli hash brevi, per la latenza introdotta nel seek.
  • Re: EVITARE DI LEGGERE LO STESSO FILE IN UNA CARTELLA

    @+m2+
    Mi piace come soluzione, comunque paga in tempo di calcolo del''hash.

    Una nota: il controllo sulla dimensione lo eviterei: se nel testo ti cambiano una '1' in un '2' la dimensione rimane la stessa, ma l'hash no quindi avresti un file modificato non 'individuato' perchè della stessa dimensione.... Poi se i file sei sicuro che non siano più modificati questo approccio ti salva da molti calcoli di hash.
  • Re: EVITARE DI LEGGERE LO STESSO FILE IN UNA CARTELLA

    È il contrario.
    se la dimensione è diversa non serve controllare hash.
    se è uguale, invece, si (chiedendo un ricalcolo)
    Se i file da lavorare son piccoli il tempo è modesto.
    se son grandi puoi introdurre un simile hash prima di ricalcolare tutto.

    Se sono molti e grandi... Si aspetta
  • Re: EVITARE DI LEGGERE LO STESSO FILE IN UNA CARTELLA

    migliorabile ha scritto:


    Parto dall'ipotesi che se il capo non vuole che vengano spostati, men che meno vorra' che gli venga cambiato il nome.
    Quindi, se ho ben capito, quando dici che "non funziona" non ti riferisci ad un difetto
    intrinseco dell'algoritmo ( che mantiene anche una parte del nome del file originale)
    ma ad una tua ipotesi comunque ancora non confermata dal richiedente,

    il quale però ha gia' scritto

    Giangi1969 ha scritto:


    Il problema che i file sono tanti e voglio evitare di leggere ogni volta gli stessi ma vorrei leggere solo l'ultimo creato.
    Ho provato a creare un file di log con tutti i file letti oppure tramite data creazione ma comunque deve sempre verificarli uno ad uno.
    quindi sembra che abbia già tentato la strada da te indicata del timestamp e cerchi qualcosa di diverso;
    e sembra anche escludere l'interessante soluzione di m2.

    Per concludere,
    se il capo vuole la botte piena e la moglie ubriaca io "m'arendo" ... non ho più idee
Devi accedere o registrarti per scrivere nel forum
17 risposte