2010-02-05 3 views
0

J'enregistre un fichier sur une clé USB et je dois m'assurer qu'il est complètement écrit pour éviter toute corruption au cas où le lecteur USB ne serait pas retiré correctement. Eh bien, j'ai fait quelques recherches et il semble que cela soit possible en appelant la fonction FlushFileBuffers Win32. Mais le problème est que j'économise en utilisant boost :: serialization et que je n'ai donc pas accès au fichier réel HANDLE. Je me demande quelle est la bonne façon de vider le fichier? Merci!Comment vider les tampons de fichiers lors de l'utilisation de boost :: serialization?

Répondre

2

Appel ostream :: flush sur le flux de sortie que vous avez créé votre objet archive avec:

// create and open a character archive for output 
std::ofstream ofs("filename"); 
boost::archive::text_oarchive oa(ofs); 

... 

ofs.flush(); 

Vous pouvez aussi tout simplement laisser les objets hors de portée qui devrait tout rincer:

{ 
    // create and open a character archive for output 
    std::ofstream ofs("filename"); 
    boost::archive::text_oarchive oa(ofs); 

    // going out of scope flushes the data 
} 

Notez que vous devez toujours démonter correctement votre périphérique USB. Le vidage des données permet simplement de s'assurer que le noyau passe directement de l'utilisateur au noyau, mais le noyau peut aussi faire sa propre mise en mémoire tampon.

+0

Merci pour la réponse! Est-il possible de garantir la sauvegarde des fichiers même si le lecteur n'est pas correctement monté, par exemple en désactivant temporairement la mise en cache des écritures sur le volume? –

+0

@Alex - malheureusement, je ne sais pas comment le faire dans Windows (ou même si c'est possible). Je recommande de poser cette question comme nouvelle. –

+1

@Alex: Non. C'est un problème FAT fondamentalement. Vous avez besoin d'un système de fichiers transactionnel pour cela, comme Ext3/exFAT. Vous pouvez bien sûr améliorer les chances. Par exemple. appelez 'FlushFileBuffers' sur le handle de volume et appelez la fonction' CreateFile' avec le 'FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH' drapeaux. – MSalters

Questions connexes