Comment s'assurer que toutes les données ont été physiquement écrites sur le disque?
Je le comprends .NET FileStream la méthode Flush seulement écrit le tampon sur le disque, mais tout dépend de Windows pilote de disque et le disque dur firmware, ce n'est pas une garantie que les données sont en fait écrites physiquement sur le disque.
Est-il .NET ou Win32 méthode qui peut me donner cette garantie? Donc si il y a perte de puissance de l'ordre de la nanoseconde après l'appel de cette méthode est de retour, je peux encore être sûr que tout est OK?
source d'informationauteur Stefan Schultze
Vous devez vous connecter pour publier un commentaire.
Sous Windows, regardez FlushFileBuffers (API Win32).
Stefan S. a dit:
Pas, .NET de FileStream Flush seulement écrit la .NET tampon dans le cache du système d'exploitation, il n'est pas de vider le cache du système d'exploitation sur le disque. Malheureusement la doc MSDN sur cette classe ne veut pas dire que. Pour .NET < 4.0, vous devez appeler Flush + Win32 l'FlushFilebuffers:
Pour .NET 4.0, vous pouvez utiliser à la place la nouvelle chasse d'eau(vrai) méthode.
11/09/2012 mise à jour: MS rapport de bug ici dit que c'est cassé, puis fixe, mais ne dit pas quelle est la version service pack ou il a été fixé dans! Sonne comme bug a été si interne .NET FileStream tampon est vide, la Chasse d'eau(vrai) n'a rien fait??
J'ai remarqué que l' .NET 4 #Flush(vrai) n'est pas réellement écrire sur le disque. Nous étions en train d'étranges problèmes avec des données corrompues et j'ai trouvé ce rapport de bug sur le MME site:
L'onglet détails pour le rapport de bug a un programme de test que vous pouvez exécuter que se montrer à la question;
fs.Flush(true)
. Cela prend peu de temps (beaucoup plus rapide que ce qui peut éventuellement écrites sur le disque).FlushFileBuffers
. Cela prend beaucoup de temps.Je suis passer à la win32 FlushFileBuffers appel...
Bien, vous pouvez fermer le fichier... ce serait probablement le faire. En réalité, avec HAL de l'abstraction, de la virtualisation, et le disque dur maintenant d'avoir plus de puissance de traitement et la mémoire cache de ordinateurs fait il y a quelques années, vous allez avoir à vivre avec, en espérant que le disque fait son travail.
Transactionnelle système de fichiers n'a jamais vraiment concrétisée ;-p bien sûr, vous pourriez peut-être regarder à l'aide d'une base de données comme un back-end, et d'utiliser le système de transaction de qui?
De côté: à noter que pas tous les flux même de garantir à
Flush()
- par exemple,GZipStream
etc conserver un travail de la mémoire tampon de données non validées, même après un ras - le seul moyen de l'obtenir pour rincer tout est àClose()
.Le fichier de données qui sont stockées dans le cache du système de fichiers à être écrites sur le disque. Que les données sont normalement paresseusement écrit, basé sur la position du disque de la tête d'écriture. Avoir un gigaoctet de données mises en cache qui est techniquement possible, de sorte qu'il peut prendre un certain temps. Si c'est important pour vous, alors envisager la
FileOptions.WriteThrough
option à la place.Il n'ya tout simplement trop de niveaux d'abstraction pour être absolument sûr que les données sont écrites sur le disque, jusqu'au niveau du matériel.
Pas brillamment performant ou infaillible, mais que diriez-re-ouvrir le fichier une fois qu'il est écrit dans un autre processus et vérifier la taille ou le contenu?