Flush cache en écriture du disque
Lorsque la politique d'un disque dans Windows XP et Vista est situé à activer le cache d'écriture sur le disque dur, est-il un moyen de vider un fichier qui vient d'être écrite, et de s'assurer qu'il a été commis sur le disque?
Je veux le faire par programmation en C++.
De la fermeture du fichier ne effectuer une chasse d'eau au niveau de l'application, mais pas au niveau du système d'exploitation. Si l'alimentation est déconnecté de l'ordinateur après la fermeture du fichier, mais avant que le système d'exploitation a vidé le cache en écriture du disque, le fichier est perdu, même si elle a été fermée.
Voulez-vous dire par programmation? La question n'est pas claire
Nous supposons que votre question est au sujet de la programmation, mais vous n'avez pas spécifié de l'environnement de développement.
Nous supposons que votre question est au sujet de la programmation, mais vous n'avez pas spécifié de l'environnement de développement.
OriginalL'auteur selwyn | 2008-10-06
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas spécifié de l'environnement de développement, donc:
.Net
IO ruisseaux ont un
.Flush
méthode qui fait ce que vous voulez.API Win32
Il est le
FlushFileBuffers
appel, qui prend un descripteur de fichier comme argument.MODIFIER (basé sur un commentaire de l'AO): FlushFileBuffers n'a pas besoin de privilèges d'administration; il n'est que si la poignée est passé est la poignée pour un volume, et non pas pour un seul fichier.
Je n'arrivais pas à en trouver un .NET de la méthode. Aussi loin que je peux voir, le seul endroit où le framework utilise FlushFileBuffers est dans SerialStream. Je soupçonne que p/invoquant FlushFileBuffers est fort à parier.
J'ai trouvé que l'appel FlushFileBuffers via pInvoke peut provoquer une exception (stackoverflow.com/q/9195807/4540). En vertu de l' .NET 4, il est plus facile et plus sûr de simplement appeler FileStream.Flush(vrai) @jimvfr suggère (stackoverflow.com/a/3992428/4540).
OriginalL'auteur tzot
.NET FileStream.Flush() ne sont PAS vider le cache de Windows pour le contenu de ce fichier; Flush() vide le .NET fichier interne de la mémoire tampon. Dans .NET 4.0, Microsoft a résolu le problème en ajoutant un paramètre facultatif à la méthode Flush() qui, si défini à true causes FlushFileSystemBuffers à être appelé. Dans .NET 3.5 et ci-dessous, votre seul choix est d'appeler FlushFileBuffers via pinvoke. Voir MSDN estFileStream.Rincer commentaires de la communauté pour savoir comment faire cela.
OriginalL'auteur jimvfr
Vous ne devriez pas corrigé au moment où vous fermez le fichier. Windows cache, sauf si vous ouvrez le fichier en passant
FILE_FLAG_WRITE_THROUGH
à CreateFile().Vous pouvez également passer
FILE_FLAG_NO_BUFFERING
; cela indique à Windows de ne pas conserver une copie des octets dans la mémoire cache.C'est plus efficace que FlushFileBuffers(), fonction CreateFile documentation MSDN.
Voir aussi fichier de mise en mémoire tampon et mise en cache des fichiers sur MSDN.
OriginalL'auteur MSalters
Vous devriez noter également, que vos données pourraient ne pas être rincé à l' réelle disque, même lors de l'invocation d'une méthode flush de vos cadres de l'API.
D'appeler la méthode flush sera seulement dire le noyau de vider ses pages sur le disque. Toutefois, si vous avez de l'écriture sur le disque-cache activé, il est permis de retarder l'écriture réel processus indéfiniment.
Afin de s'assurer que vos données sont écrites sur la couche physique, vous devez tourner le cache d'écriture de votre système d'exploitation. Cela vient le plus souvent avec une perte de performance jusqu'à un ou deux ordres de grandeur lorsque l'on traite avec beaucoup de petits io-opérations.
Batterie en fonction de soutien (UPS) ou les disques que d'accepter des commandes pour vider l'écriture sur le disque-cache sont une autre option pour traiter ce problème.
Bien sûr qu'il le fera. Toutefois, Si le disque dur de l'écrire-cache est activé, le disque peut interrompre l'écriture de l'opération. Lire, par exemple: support.microsoft.com/kb/259716/EN-US Citation: "En permettant la mise en cache d'écriture, la corruption du système de fichiers et/ou une perte de données peut se produire si la machine expériences d'une puissance, d'un appareil ou de défaillance du système et ne peut pas être arrêté correctement."
En fait, Windows la force de rincer la mise en cache sur FlushFileBuffers (), peu importe si le cache en écriture du tampon a été allumé, et même si le cache en écriture de rinçage (précédemment connu sous le nom "advanced performance case") a été activée.
OriginalL'auteur Philipp
De l'documents microsoft vous utilisez _flushall et un lien dans la COMMODE.OBJ pour s'assurer que tous les tampons ont été commis sur le disque.
OriginalL'auteur SmacL