windows - pudo - vaciado de cache
Vaciar caché de escritura de disco (5)
De los documentos de Microsoft usaría _flushall y enlazaría en COMMODE.OBJ para asegurarse de que todos los búferes estuvieran comprometidos en el disco.
Cuando la política para un disco en Windows XP y Vista está configurada para habilitar el almacenamiento en caché de escritura en el disco duro, ¿hay alguna manera de vaciar un archivo que acaba de escribirse y asegurarse de que se haya entregado al disco?
Quiero hacer esto programáticamente en C ++.
Al cerrar el archivo, se realiza un lavado a nivel de la aplicación, pero no a nivel del sistema operativo. Si se elimina la energía de la PC después de cerrar el archivo, pero antes de que el sistema operativo haya limpiado la caché de escritura del disco, el archivo se pierde, aunque se haya cerrado.
No ha especificado el entorno de desarrollo, entonces:
.Red
Las transmisiones IO tienen un método .Flush
que hace lo que usted desea.
Win32 API
Existe la llamada FlushFileBuffers
, que toma un identificador de archivo como argumento.
EDIT (basado en un comentario del OA): FlushFileBuffers no necesita privilegios administrativos; solo lo hace si el identificador que se le transfiere es el manipulador de un volumen, no de un solo archivo.
No deberías solucionar esto al momento de cerrar el archivo. Windows almacenará en caché, a menos que abra el archivo pasando FILE_FLAG_WRITE_THROUGH
a FILE_FLAG_WRITE_THROUGH
().
Es posible que también desee pasar FILE_FLAG_NO_BUFFERING
; esto le dice a Windows que no conserve una copia de los bytes en el caché.
Esto es más eficiente que FlushFileBuffers (), según la documentación de CreateFile en MSDN.
Consulte también almacenamiento en memoria intermedia de archivos y almacenamiento en memoria caché de archivos en MSDN.
También debe tener en cuenta que es posible que sus datos no se descarguen en el disco real , incluso cuando se invoca un método de vaciado de su API de frameworks.
Llamar al método de lavado solo le indicará al kernel que vacíe sus páginas en el disco. Sin embargo, si tiene activado el caché de escritura de disco, se puede retrasar el proceso de escritura real indefinidamente.
Para asegurarse de que sus datos se escriben en la capa física, debe activar la caché de escritura en su sistema operativo. Esto a menudo viene con una penalización de rendimiento de hasta uno o dos órdenes de magnitud cuando se trata de una gran cantidad de pequeñas operaciones. El soporte basado en batería (UPS) o los discos que aceptan comandos para eliminar el caché de escritura del disco son otra opción para resolver este problema.
.NET FileStream.Flush () NO arrojará el caché de Windows para ese contenido del archivo; Flush () solo vacía el buffer de archivos internos de .NET. En .NET 4.0, Microsoft solucionó el problema agregando un parámetro opcional a Flush () que si se establece como verdadero hace que se llame a FlushFileSystemBuffers. En .NET 3.5 y versiones inferiores, su única opción es llamar a FlushFileBuffers a través de pinvoke. Consulte el comentario de la comunidad FileStream.Flush de MSDN para saber cómo hacer esto.