Dernière modification du fichier Ne se met pas à jour lorsque Java écrit sur Windows Server 2016


J'ai une application Java 10 sur Windows Server 2016 qui écrit continuellement dans un fichier en utilisant java.util.journalisation. Dans l'Explorateur de fichiers Windows, les colonnes" Dernière modification "et" Taille " ne sont pas mises à jour. Appuyer sur [F5] ne met pas à jour les détails. DOS DIR donne la même réponse incorrecte. Clic droit > Propriétés > Détails donne une réponse encore différente (et plus ancienne).

Exécuter uniquement DOS TYPE ou ouvrir / fermer (sans enregistrer) dans le bloc-notes sur le fichier, semble provoquer un fichier Explorer et DOS DIR à mettre à jour.

Je suppose que le code Java est correct par rapport à flush() car les mêmes classes sur Java 8 sur Windows Server 2008 provoquent la mise à jour de l'Explorateur de fichiers. De plus, lors de l'exécution de TYPE et du Bloc-notes, je vois également les enregistrements horodatés correspondant à l'horloge système, mais bien après "Dernière modification".

Donc je suppose qu'il y a quelque chose avec Windows Server 2016. Toutes les idées que vérifier?

Author: lafual, 2018-07-31

1 answers

Donc je suppose qu'il y a quelque chose avec Windows Server 2016. Toutes les idées que vérifier?

Par défaut, Windows est configuré pour fonctionner de cette façon. À partir de L'horodatage du fichier ne se met pas à jour sur 2008 mais le fait sur 2003:

En 2003, en ouvrant le dossier du fichier journal dans l'explorateur, vous pouvez voir l'horodatage et la taille des fichiers changer sous vos yeux chaque fois que le journal est mis à jour.

Sur 2008, la plupart du temps, il n'y a pas de changement sauf si vous interagissez dans un autre façon...

[snip]

Oui, certains de ces attributs ont été désactivés en 2008. Si vous voulez par exemple voir/utiliser l'heure "Dernier accès", vous devez activer le suivi de cet attribut.

Vous pouvez l'activer en définissant HKLM\System\CurrentControlSet\Control\FileSystem\NtfsDisableLastAccessUpdate sur 0 (cette valeur est REG_DWORD).

Veuillez vous méfier que son pourrait avoir un impact sur les performances de disk IO sur les serveurs de fichiers occupés !

Donc le le comportement était un changement pour améliorer les performances.

Depuis les serveurs Web de réglage des performances:

Le commutateur system-global NtfsDisableLastAccessUpdate (REG_DWORD) 1 se trouve sous HKLM\System\CurrentControlSet\Control\FileSystem et est défini par défaut sur 1. Ce commutateur réduit la charge et les latences d'E/S de disque en désactivant la mise à jour de l'horodatage pour le dernier accès au fichier ou au répertoire. Nettoyer les installations de Windows Server 2016, Windows Server 2012 R2, Windows Le serveur 2012, Windows Server 2008 R2, et Windows Server 2008 activent ce paramètre par défaut, et vous n'avez pas besoin de l'ajuster. Les versions antérieures de Windows n'ont pas défini cette clé. Si votre serveur exécute une version antérieure de Windows ou s'il a été mis à niveau vers Windows Server 2016, Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 ou Windows Server 2008, vous devez activer ce paramètre.

Il semble que ce paramètre peut toujours être utilisé dans Windows Server 2016.

Je suppose que le code Java est correct par rapport à flush() car les mêmes classes sur Java 8 sur Windows Server 2008 provoquent la mise à jour de l'Explorateur de fichiers. De plus, lors de l'exécution de TYPE et du Bloc-notes, je vois également les enregistrements horodatés correspondant à l'horloge système, mais bien après "Dernière modification".

Flush n'est pas la même que la synchronisation. Le FileHandler effectue simplement un vidage après la publication de chaque enregistrement. Windows n'est pas configuré pour forcer l'écriture des métadonnées dans le système de fichiers. À partir de La propriété "Date de modification" du fichier ne se met pas à jour lors de la modification d'un fichier sans le fermer.:

En 2008, le champ "Dernière modification" des fichiers journaux n'est pas mis à jour à moins qu'un autre programme tente d'ouvrir le fichier ou l'utilitaire est arrêté, même si vous appuyez sur F5 pour actualiser l'affichage.

Explorer obtient des informations de NTFS, en utilisant une invite cmd et "dir", nous avons constaté que les métadonnées NTFS pour les fichiers ne sont pas mises à jour tant que le handle d'un fichier n'est pas fermé.

L'actualisation des informations d'un DOSSIER va simplement aller aux métadonnées (résidentes en mémoire) mises en cache par NTFS, mais l'interrogation explicite du fichier forcera les E/S de disque à obtenir les propriétés - c'était un changement de conception introduit dans Vista pour réduire les E/S de disque inutiles pour améliorer les performances

Il y a quelques exceptions à cette règle: - dans certains cas, mais pas tous, un simple "dir filename" suffit pour actualiser les métadonnées - les dossiers "spéciaux" peuvent être traités différemment, tels que les profils d'utilisateurs où nous ne nous attendons pas à un grand nombre de fichiers et voulons pouvoir compter sur les données de fichier présentées - les pilotes de filtre du noyau peuvent modifier le comportement car, de par leur conception, ils " ajoutent, suppriment ou modifier la fonctionnalité des autres pilotes "

Comme la solution de contournement est pour tout processus d'ouvrir et de fermer un handle aux fichiers journaux, un outil a été écrit pour faire exactement cela, plus obtenir les informations de fichier, en utilisant les API suivantes:

  • Créer un fichier
  • GetFileInformationByHandle
  • Fermer la main

Vous pouvez peut-être tenter d'ouvrir un FileInputStream en utilisant le nom de fichier créé par le gestionnaire de fichiers.

L'exécution du TYPE DOS ou l'ouverture/fermeture (sans sauvegarde) dans le bloc-notes du fichier semble provoquer la mise à jour de l'Explorateur de fichiers et du répertoire DOS.

La seule méthode universelle que j'ai trouvée pour mettre à jour les métadonnées à partir d'un processus extérieur consiste à sélectionner un fichier à l'aide du fichier explorer de manière interactive:

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

Très probablement, cela ressemble beaucoup à ce qui se passe dans le bloc-notes.

J'aime votre utilisation de TYPE commande. Vous pouvez l'utiliser avec le nul pour ignorer la sortie.

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