2009-09-18 14 views
7

En mi proyecto, tengo que crear algunos archivos temporales en un dispositivo USB, que quiero eliminar al cerrar. Así que utilicé un código comoFileStream con la opción DeleteOnClose File

this.fcommandHandler = new FileStream(TempFileName, 
FileMode.CreateNew, FileAccess.ReadWrite, 
FileShare.ReadWrite, 512, FileOptions.DeleteOnClose); 

Funciona bien. Pero el problema es que quiero usar una FileOption más, como Sin almacenamiento en búfer.

private const FileOptions FILE_FLAG_NO_BUFFERING = (FileOptions)0x20000000; 

this.fcommandHandler = new FileStream(TempFileName, 
FileMode.CreateNew, FileAccess.ReadWrite, 
FileShare.ReadWrite, 512, FileOptions.DeleteOnClose & FILE_FLAG_NO_BUFFERING); 

Pero no se elimina el archivo después del cierre. Por favor ayuda.

Respuesta

8

Tiene que utilizar | en lugar de &.

Estos son indicadores binarios, y cuando dice &, los enmascara de forma efectiva, lo que no da lugar a ninguna opción.

+0

Pero estoy obteniendo una excepción "La operación IO no funcionará. Lo más probable es que el archivo sea demasiado largo o el asa no se abrió para admitir operaciones IO sincrónicas.", Si puse | en lugar de &, cuando estoy llamando a this.fcommandHandler.Close() – Anuraj

+1

@Anuraj: Eso no significa | está mal, significa que algo en tu uso es incorrecto. Lasse tiene razón en que necesitas | en lugar de &. La excepción es tu próximo problema para resolver. –

+0

@Jeff Yates: Gracias, permítanme probar con algunas otras opciones. – Anuraj

2

Usar FileOptions.DeleteOnClose | FILE_FLAG_NO_BUFFERING el & los cancela.

FILE_FLAG_NO_BUFFERING & FileOptions.DeleteOnClose vuelve FileOptions.None

+0

Por favor, verifique el comentario de la primera respuesta. – Anuraj

+0

@Anuraj: Estoy tratando de averiguar qué es File_flag_no_buffering, definitivamente DeleteOnClose no se llama porque está haciendo un y en lugar de un o. –

+0

@Yuriy Faktorovich - La opción de archivo File_flag_no_buffering es una opción de archivo, que ayuda a evitar el almacenamiento en memoria caché de archivos al leer y escribir archivos, en Windows. Compruebe esto http://stackoverflow.com/questions/122362/how-to-empty-flush-windows-read-disk-cache-in-c – Anuraj

0

intente incluir la bandera WriteThrough así en una lista con el | operador. Consulte esto KB sobre los requisitos para usar FILE_FLAG_NO_BUFFERING. Es interesante que MS no haya incluido esta bandera en la enumeración. ¿Hay alguna razón por la cual WriteThrough no hace lo que necesita en este escenario? ¿Estás tratando de escribir datos seguros?

+0

@AnthonyWJones: Intenté esto pero sigo recibiendo este error. Estoy tratando de lograr es como: Tengo que emitir algunos comandos a un dispositivo USB a través de un archivo (por ejemplo, cmd.bin), y devolverá algunas respuestas en un archivo (por ejemplo, res.bin). Pero si uso C# Stream normal, Windows almacenará en caché la respuesta y siempre obtendré la misma respuesta, por lo tanto, debo usar el indicador No Buffering. Y los archivos son temporales, así que tengo que eliminarlos después de su uso; es por eso que estoy usando Delete on close flag. – Anuraj

+0

En ese caso, la pregunta que Yuriy le ha dirigido tiene un enfoque diferente para abrir un archivo así, lo probaría. – AnthonyWJones

Cuestiones relacionadas