Puis-je utiliser CreateFile, mais forcer le handle dans un std :: ofstream?

Existe-t-il un moyen de tirer parti des indicateurs de création de fichiers dans l’API Win32 tels que FILE_FLAG_DELETE_ON_CLOSE ou FILE_FLAG_WRITE_THROUGH comme décrit ici http://msdn.microsoft.com/fr-fr/library/aa363858(VS.85).aspx , mais puis forcer cette poignée dans un std :: ofstream?

L’interface vers ofstream est évidemment indépendante de la plate-forme; Je voudrais forcer certains parameters dépendant de la plate-forme dans «sous le capot» en quelque sorte.

Il est possible d’attacher un std::ofstream C ++ à un handle de fichier Windows. Le code suivant fonctionne dans VS2008:

 HANDLE file_handle = CreateFile( file_name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (file_handle != INVALID_HANDLE_VALUE) { int file_descriptor = _open_osfhandle((intptr_t)file_handle, 0); if (file_descriptor != -1) { FILE* file = _fdopen(file_descriptor, "w"); if (file != NULL) { std::ofstream stream(file); stream << "Hello World\n"; // Closes stream, file, file_descriptor, and file_handle. stream.close(); file = NULL; file_descriptor = -1; file_handle = INVALID_HANDLE_VALUE; } } 

Cela fonctionne avec FILE_FLAG_DELETE_ON_CLOSE , mais FILE_FLAG_WRITE_THROUGH peut ne pas avoir l'effet désiré, car les données seront mises en mémoire tampon par l'object std::ofstream et ne seront pas écrites directement sur le disque. Toutes les données du tampon seront vidées dans le système d'exploitation lorsque stream.close() est appelé.

Certains de ces indicateurs sont également disponibles lors de l’utilisation de _fsopen / fopen:

 FILE* pLockFile = _fsopen(tmpfilename.c_str(), "w", _SH_DENYWR ); if (pLockFile!=NULL { // Write lock aquired ofstream fs(pLockFile); } 

Ici, nous ouvrons le fichier alors quand vous faites un flush, il écrit à travers (Et il est supprimé quand il est fermé):

 FILE* pCommitFile = fopen(tmpfilename.c_str(), "wcD"); if (pCommitFile!=NULL) { // Commits when doing flush ofstream fs(pCommitFile); }