2009-09-18 18 views
7

Nel mio progetto devo creare alcuni file temporanei in un dispositivo USB, che voglio eliminare in chiusura. Quindi ho usato un codice comeFileStream con DeleteOnClose Opzione file

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

Funziona bene. Ma il problema è che voglio usare un altro FileOption, come No buffering.

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

Ma non sta eliminando il file dopo la chiusura. Per favore aiuto.

risposta

8

È necessario utilizzare | invece di &.

Questi sono i contrassegni binari e quando si dice &, si mascherano tutti in modo efficace, senza alcuna opzione.

+0

Ma ricevo un'eccezione "L'operazione IO non funzionerà Molto probabilmente il file diventerà troppo lungo o l'handle non è stato aperto per supportare operazioni IO sincrone.", Se inserisco | invece di &, quando sto chiamando this.fcommandHandler.Close() – Anuraj

+1

@Anuraj: Ciò non significa | è sbagliato, significa che qualcosa nel tuo utilizzo non è corretto. Lasse ha ragione di cui hai bisogno | invece di &. L'eccezione è il tuo prossimo problema da risolvere. –

+0

@Jeff Yates: Grazie lasciami provare con alcune altre opzioni. – Anuraj

2

Utilizzare FileOptions.DeleteOnClose | FILE_FLAG_NO_BUFFERING lo & li cancella.

FILE_FLAG_NO_BUFFERING & FileOptions.DeleteOnClose torna FileOptions.None

+0

Si prega di controllare il commento della prima risposta. – Anuraj

+0

@Anuraj: Sto cercando di capire cosa sia il File_flag_no_buffering, il DeleteOnClose non viene sicuramente chiamato perché stai facendo un e invece di un o. –

+0

@Yuriy Faktorovich - L'opzione File_flag_no_buffering è un'opzione di file, che aiuta a evitare il caching dei file durante la lettura e la scrittura dei file, da parte di Windows. Controlla questo http://stackoverflow.com/questions/122362/how-to-empty-flush-windows-read-disk-cache-in-c – Anuraj

0

Prova compresa la bandiera WriteThrough pure in un elenco tramite l'| operatore. Vedere questo KB sui requisiti per l'utilizzo di FILE_FLAG_NO_BUFFERING. È interessante il fatto che la SM non abbia incluso questa bandiera nell'enum. C'è un motivo per cui WriteThrough non fa ciò che ti serve in questo scenario? Stai provando a scrivere dati sicuri?

+0

@AnthonyWJones: Ho provato questo, ma sto ricevendo questo errore. Sto cercando di ottenere è come: Devo inviare alcuni comandi a un dispositivo USB tramite un file (es. Cmd.bin), e restituirà alcune risposte in un file (ad esempio res.bin). Ma se uso il normale C# Stream Windows memorizzerà la risposta nella cache e otterrò sempre la stessa risposta, quindi devo usare il flag No Buffering. E i file sono temporanei quindi devo cancellarlo dopo l'uso: ecco perché sto usando Delete On close flag. – Anuraj

+0

In questo caso la domanda che Yuriy ha rivolto a te ha un approccio diverso nell'aprire un file di questo tipo, darei una scossa. – AnthonyWJones

Problemi correlati