File Ultima modifica Non aggiornamento quando Java scrive su Windows Server 2016


Ho un'applicazione Java 10 su Windows Server 2016 che sta scrivendo continuamente su un file usando java.util.registrazione. In Esplora file di Windows, le colonne" Ultima modifica "e" Dimensione " non vengono aggiornate. Premendo [F5] non vengono aggiornati i dettagli. DOS DIR fornisce la stessa risposta errata. Fare clic destro > Proprietà > Dettagli fornisce una risposta ancora diversa (e precedente).

Solo l'esecuzione di DOS TYPE o l'apertura /chiusura (senza salvataggio) nel blocco note sul file, sembra causare il file Explorer e DOS DIR da aggiornare.

Presumo che il codice Java sia corretto rispetto a flush() poiché le stesse classi su Java 8 su Windows Server 2008 causano l'aggiornamento di Esplora file. Inoltre, quando si eseguono TYPE e Blocco note, vedo anche i record con data e ora corrispondenti all'orologio di sistema, ma ben dopo "Ultima modifica".

Quindi presumo che ci sia qualcosa con Windows Server 2016. Qualche idea su cosa controllare?

Author: lafual, 2018-07-31

1 answers

Quindi presumo che ci sia qualcosa con Windows Server 2016. Qualche idea su cosa controllare?

Per impostazione predefinita Windows è configurato per funzionare in questo modo. Da timestamp del file non aggiornato sul 2008 ma attivo 2003:

Nel 2003, aprendo la cartella dei file di registro in Explorer, è possibile vedere il timestamp e le dimensioni dei file cambiare davanti ai vostri occhi ogni volta che il registro viene aggiornato.

Nel 2008, la maggior parte delle volte, non vi è alcun cambiamento a meno che non si interagisca in qualche altro modo...

[snip]

Sì, alcuni di questi attributi sono stati disabilitati nel 2008. Se si desidera, ad esempio, vedere/utilizzare l'ora "Ultimo accesso", è necessario abilitare il tracciamento di questo attributo.

È possibile abilitare questa opzione impostando HKLM\System\CurrentControlSet\Control\FileSystem\NtfsDisableLastAccessUpdate su 0 (questo valore è REG_DWORD).

Fai attenzione che il suo potrebbe influire sulle prestazioni di I / O del disco sui file server occupati !

Quindi il comportamento era cambiamento per migliorare le prestazioni.

Dai server Web di ottimizzazione delle prestazioni :

Lo switch system-global NtfsDisableLastAccessUpdate (REG_DWORD) 1 si trova in HKLM\System\CurrentControlSet\Control\FileSystem ed è impostato per impostazione predefinita su 1. Questa opzione riduce il carico di I / O del disco e le latenze disabilitando l'aggiornamento di data e ora per l'ultimo accesso a file o directory. Installazioni pulite di Windows Server 2016, Windows Server 2012 R2, finestre Server 2012, Windows Server 2008 R2 e Windows Server 2008 abilitano questa impostazione per impostazione predefinita e non è necessario regolarla. Le versioni precedenti di Windows non impostavano questa chiave. Se il server esegue una versione precedente di Windows o è stato aggiornato a Windows Server 2016, Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 o Windows Server 2008, è necessario abilitare questa impostazione.

Sembra che questa impostazione possa ancora essere utilizzata in Windows Server 2016.

Presumo che il codice Java sia corretto rispetto a flush() poiché le stesse classi su Java 8 su Windows Server 2008 causano l'aggiornamento di Esplora file. Inoltre, quando si esegue TYPE e Notepad, vedo anche i record con data e ora corrispondenti all'orologio di sistema, ma ben dopo "Ultima modifica".

Flush non è lo stesso di sync . Il FileHandler esegue solo un flush dopo che ogni record è stato pubblicato. Windows non è configurato per forzare la scrittura dei metadati nel file system. Dal file la proprietà "Data modificata" non viene aggiornata durante la modifica di un file senza chiuderlo.:

Nel 2008, il campo" Ultima modifica " nei file di registro non viene aggiornato a meno che un altro il programma tenta di aprire il file o l'utilità viene interrotta, anche se F5 viene premuto per aggiorna la vista.

Explorer ottiene informazioni da NTFS, utilizzando un prompt cmd e " dir " abbiamo scoperto che i metadati NTFS per i file non vengono aggiornati fino a quando l'handle di un file non è chiuso.

L'aggiornamento delle informazioni di una CARTELLA andrà solo ai metadati (residenti nella memoria) memorizzati nella cache da NTFS, ma l'interrogazione esplicita del file forzerà l'I / O del disco per ottenere le proprietà-questa è stata una modifica di progettazione introdotta in Vista per ridurre l'I/O del disco non necessario per migliorare le prestazioni

Ci sono alcune eccezioni a questa regola: - in alcuni casi, ma non in tutti, è sufficiente un semplice "nome file dir" per aggiornare i metadati - le cartelle "speciali" possono essere trattate in modo diverso, come ad esempio i profili utente in cui non ci aspettiamo un gran numero di file e vogliamo essere in grado di fare affidamento sui dati dei file presentati - i driver del filtro del kernel possono modificare il comportamento in base alla progettazione che " aggiungono, rimuovono o modificare la funzionalità di altri driver "

Poiché la soluzione alternativa è che qualsiasi processo apra e chiuda un handle ai file di registro, è stato scritto uno strumento per fare esattamente questo, oltre a ottenere le informazioni sul file, utilizzando le seguenti API:

  • Crea file
  • GetFileInformationByHandle
  • Maniglia di chiusura

È possibile tentare di aprire un FileInputStream utilizzando il nome del file creato da FileHandler.

Solo l'esecuzione del TIPO DOS o l'apertura/chiusura (senza salvataggio) nel blocco note sul file, sembra causare l'aggiornamento di File Explorer e DOS DIR.

L'unico metodo universale che ho trovato per aggiornare i metadati da un processo esterno è selezionare un file utilizzando il file esplora in modo interattivo:

explorer /select, c:\test\file.txt

Molto probabilmente questo è molto simile a ciò che sta accadendo nel blocco note.

Mi piace il tuo uso del comando TYPE. Puoi usarlo con nul per ignorare l'output.

type filename.log > NUL
 3
Author: jmehrens, 2018-08-02 02:46:49