2009-09-18 5 views
7

Dans mon projet, je dois créer des fichiers temporaires dans un périphérique USB que je veux supprimer à la fermeture. J'ai donc utilisé un code commeFileStream avec DeleteOnClose Option de fichier

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

Cela fonctionne très bien. Mais le problème est que je veux utiliser un FileOption de plus, comme Pas de mise en mémoire tampon.

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); 

Mais il ne supprime pas le fichier après la fermeture. S'il vous plaît aider.

Répondre

8

Vous devez utiliser | au lieu de &.

Ce sont des drapeaux binaires, et quand vous dites &, vous les masquer efficacement, sans aucune option du tout.

+0

Mais je reçois une exception "opération IO ne fonctionnera pas.Plus probablement le fichier deviendra trop long ou le handle n'a pas été ouvert pour soutenir les opérations d'E/S synchrones.", Si je mets | au lieu de &, quand j'appelle this.fcommandHandler.Close() – Anuraj

+1

@Anuraj: Cela ne veut pas dire | est faux, cela signifie que quelque chose dans votre utilisation est incorrecte. Lasse est juste que vous avez besoin | au lieu de &. L'exception est votre prochain problème à résoudre. –

+0

@Jeff Yates: Merci mon essai avec d'autres options. – Anuraj

2

Utiliser FileOptions.DeleteOnClose | FILE_FLAG_NO_BUFFERING les & les annule.

FILE_FLAG_NO_BUFFERING & retourne FileOptions.DeleteOnClose FileOptions.None

+0

S'il vous plaît vérifier le commentaire de la première réponse. – Anuraj

+0

@Anuraj: J'essaie de comprendre ce que File_flag_no_buffering est, le DeleteOnClose n'est définitivement pas appelé parce que vous faites un et à la place d'un ou. –

+0

@Yuriy Faktorovich - L'option File_flag_no_buffering file est une option de fichier, qui permet d'éviter la mise en cache de fichiers lors de la lecture et de l'écriture de fichiers, par Windows. Cochez cette case http://stackoverflow.com/questions/122362/how-to-empty-flush-windows-read-disk-cache-in-c – Anuraj

0

Essayez d'inclure le drapeau ainsi WriteThrough dans une liste à l'aide | opérateur. Voir ce KB sur les conditions d'utilisation de FILE_FLAG_NO_BUFFERING. C'est intéressant que MS n'a pas inclus ce drapeau dans l'énumération. Y at-il une raison pour laquelle WriteThrough ne fait pas ce dont vous avez besoin dans ce scénario? Vous essayez d'écrire des données sécurisées?

+0

@AnthonyWJones: J'ai essayé ceci mais j'obtiens toujours cette erreur. J'essaie de réaliser est comme: Je dois émettre quelques commandes à un USB via un périphérique de fichier (ex cmd.bin), et il retournera quelques réponses dans un fichier (par exemple res.bin). Mais si j'utilise Windows C# Stream normal mettra en cache la réponse et toujours j'obtiendrai la même réponse, donc je dois utiliser le drapeau No Buffering. Et les fichiers sont temporaires, donc je dois le supprimer après utilisation, c'est pourquoi j'utilise Delete On close flag. – Anuraj

+0

Dans ce cas, la question que Yuriy vous a posée a une approche différente de l'ouverture d'un tel fichier, je vais essayer. – AnthonyWJones

Questions connexes