2012-04-03 11 views
6

Ho scritto uno strumento per raccogliere i file di registro all'interno di una finestra temporale specificata dall'utente dello strumento. Fino ad ora stavo basando la raccolta di file di registro utilizzando il metodo File.GetLastWriteTime sui file di registro, confrontandolo con le volte che l'utente ha inserito e collezionando in base al risultato di tali confronti. Ecco un piccolo frammento di codice:File.GetLastWriteTime sembra restituire il valore 'non aggiornato'

DateTime logFileEnd = File.GetLastWriteTime(matchingActiveLogFile); 

Tuttavia ho notato il mio strumento non ha ancora raccogliere alcune file di log ho pensato che avrebbe dovuto fare. Sembra che il DateTime restituito da questo metodo non fosse aggiornato (c'era più recente accesso al file rispetto al valore di questo datetime).

Quando ho visto la "Data di modifica" del file in questione, anche questa era "obsoleta", c'era più recente accesso nel file rispetto a "Data di modifica".

In che modo è possibile ottenere un valore "GetLastWriteTime" o un valore di data modificato?

+0

Cosa intendi per * DateTime restituito con questo metodo non è stato aggiornato *? La data – V4Vendetta

+1

non si aggiorna dopo un po '? Ad esempio, quando vedi che la data modificata è "non aggiornata", attendi ~ 30 secondi e poi controlla di nuovo la data. – Reniuz

+1

Leggi anche questo articolo: http://blogs.technet.com/b/asiasupp/archive/2010/12/14/file-date-modified-property-are-not-updating-while-modifying-a-file- senza-closing-it.aspx potrebbe essere che si verificano lo stesso – Reniuz

risposta

9

Durante la mia esperienza sono andato a gettare un paio di problemi come il tuo. Sui sistemi WindowsVista/7 che funzionano non sempre restituisce un risultato affidabile.

Dopo un po 'abbiamo trovato questo link: Disabling Last Access Time in Windows Vista to improve NTFS performance

e capire che non può essere una "chiave forte". Per risolvere questo problema, abbiamo appena smettiamo di inoltro on

GetLastWriteTime 

chiamata, ma memorizzare il valore dell'ultima modifica del file o in suo nome, come "FileName_yyyymmdd", o all'interno di quel file in qualche campo.

C'è un'altra soluzione per GetLastAccessTime potete trovare qui:

.NET FileInfo.LastWriteTime & FileInfo.LastAccessTime are wrong, potrebbe essere utile nel vostro caso anche.

La mia opinione generale su questo sarebbe: non inoltrare su quel parametro, ma inventare qualcos'altro nella tua architettura.

Buona fortuna

+3

ho avuto mal di testa con la data di creazione del file. se si crea un file, cancellarlo e crearlo nuovamente (con lo stesso nome) la data di creazione sarà del file precedentemente creato. Dopo un po 'ho scoperto che OS ripristina la data dalla cache se il file viene ricreato durante 15 secondi. La soluzione era cambiare il nome del file ogni volta, come hai detto tu. – Reniuz

+1

@Reniuz: suona familiare :) Infatti, poiché avevamo molti clienti in paesi/culture completamente diversi, da WindowsXp -> Windows7 64 bit, le informazioni non affidabili come quelle erano assolutamente inaccettabili. – Tigran

1

Tigran è giusto:

Si può provare a confrontare i cambiamenti dimensione del file, oltre a ora dell'ultima scrittura. È quello che faccio (con FileSystemWatcher, ma è simile a confrontare i campi all'interno di una finestra temporale).

+0

Grazie per quello Eric! Non ci avevo mai pensato prima! – DukeOfMarmalade

Problemi correlati