Trova se determinati file sono stati aggiunti o rimossi nella struttura di directory di grandi dimensioni

0

Ho una struttura di directory più grande (dir + sottodirectory) con i file. Contiene file di determinati tipi. Per un tipo particolare (diciamo con l'appendice .foo ) ho bisogno di capire se i file sono stati aggiunti, modificati o cancellati .

Il primo approccio era quello di iterare su tutti i file e controllare il timestamp dei file. Funziona abbastanza bene per i file locali, ma una volta che risiedono su un file system di rete diventa troppo lento.

E, per rilevare i file cancellati, devo comunque creare e indicizzare. Un'idea è di creare valori hash per i file rilevanti e memorizzarli per directory. Sfortunatamente il caso normale è che nulla cambia la maggior parte del tempo, eppure devo ancora ricalcolare tutti i valori hash (lenti) solo per rilevare che non è cambiato nulla.

Nota: sto codificando in Qt 5.6 / C ++ e il codice deve funzionare su Windows, Mac e Linux, ma il focus della domanda è più il concetto e non il codice funzionante.

--- edit ---

Alcuni chiarimenti (come richiesto di seguito)

  • si tratta di file per la simulazione di volo. Quando l'utente aggiunge o modifica i file, devo rieseguire alcune attività come analizzare questi file. I file foo sono file speciali a cui tengo, mentre i 10000 altri file del simulatore di volo possono essere ignorati. Il mio obiettivo è scoprire se devo iniziare il costoso processo di analisi, che è necessario solo se è stato modificato qualsiasi file foo
  • c'è davvero qualcosa come un monitor che guarda i file modificati in Qt QFileSystemWatcher . Ma non posso garantire di monitorare tutto il tempo, inoltre non sarebbe necessario. Quando avviò il mio software ho bisogno di scoprire se qualche file foo è cambiato, se così inizio analizzo, altrimenti salta questo passaggio.
  • Ci sono circa 100 file di foo fino al 10000% all'interno di una struttura di directory di > 50000 file
  • I file cambiano perché l'utente installa nuove funzionalità o ne elimina alcune. Questo accade mentre il mio software non è in esecuzione, ho già detto che non posso monitorare tutto il tempo. Quindi ho bisogno di qualcosa che funzioni dopo aver avviato il mio software
  • Non ci sono client / server e ha bisogno di lavorare su Linux, Mac e Windows (ma questo è già stato menzionato nel post originale)
posta Horst Walter 31.03.2016 - 13:15
fonte

1 risposta

1

Se possibile, fare in modo che tale monitoraggio si verifichi close su disco. In particolare, evitare il monitoraggio dei file system remoti. Effettuare invece il programma di monitoraggio sul file server. La cosa del monitoraggio potrebbe non avere bisogno di un'interfaccia Qt (in altre parole, se hai bisogno di un'interfaccia Qt, rendila un eseguibile separato che comunica con il monitor). Forse il monitor potrebbe essere interrogabile tramite HTTP (usando una libreria di server HTTP come libonion in esso).

Su Linux con file system originali come Ext4, puoi usare inotify (7) facilities (che non funzionano su file system remoti o su pseudo file system à la /proc/ )

Potresti davvero creare e mantenere un indice, usando nftw (3) .

Sembra che i normali file system non siano ottimali per il lavoro nel suo insieme. Forse dovresti pensare al contrario, e utilizzare un vero database con trigger (anziché file system) per archiviare i dati monitorati. Hai considerato MariaDB, PostGreSQL, MongoDB?

Vedi anche locate (1) & updatedb (1)

Unfortunately the normal case is that nothing changes most of the time, yet I still have to recalculate all hash values (slow) just to detect nothing changed.

Di nuovo (con una prospettiva Linux, o qualsiasi sistema operativo e file system con tempi di modifica affidabili!) non è necessario farlo. Esegui una query sui metadati del file -size e tempo di modifica- con stat (2) o con QFileInfo e il suo lastModified() & Funzioni membro size() , mantieni il valore hash e ricalcoli i valori hash (quindi rileggi i contenuti del file) solo quando cambiano le dimensioni o il tempo mtime del file (dal precedente valore hash).

Sembra che tu stia reinventando make o omake o qualche altro costruttore ... (alcuni di loro funzionano su checksum del contenuto, non in mtimes).

    
risposta data 31.03.2016 - 15:12
fonte

Leggi altre domande sui tag