2009-09-18 41 views
7

在我的項目中,我必須在USB設備中創建一些臨時文件,我想在關閉時刪除這些文件。所以我使用的代碼如使用DeleteOnClose File選項的FileStream

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

它工作正常。但問題是我想使用一個更多的FileOption,就像無緩衝。

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

但它沒有關閉後刪除文件。請幫忙。

回答

8

您需要使用|而不是&。

這些是二進制標誌,當你說&時,你有效地掩蓋了它們,導致沒有任何選項。

+0

但是我收到了一個異常:「IO操作無法正常工作,很可能文件將變得太長或者句柄沒有打開以支持同步IO操作。」,如果我把|而不是&,當我調用this.fcommandHandler.Close() – Anuraj

+1

@Anuraj:這並不意味着|這是錯誤的,這意味着您的使用情況不正確。 Lasse是正確的,你需要|代替 &。例外是你要解決的下一個問題。 –

+0

@Jeff Yates:謝謝讓我嘗試一些其他選項。 – Anuraj

2

使用FileOptions.DeleteOnClose | FILE_FLAG_NO_BUFFERING &將其取消。

FILE_FLAG_NO_BUFFERING & FileOptions.DeleteOnClose使用返回FileOptions.None

+0

請檢查第一個答案的評論。 – Anuraj

+0

@Anuraj:我想弄清楚File_flag_no_buffering是什麼,DeleteOnClose肯定不會被調用,因爲你正在做一個而不是一個or。 –

+0

@Yuriy Faktorovich - File_flag_no_buffering文件選項是一個文件選項,它有助於在Windows讀取和寫入文件時避免文件緩存。檢查這個http://stackoverflow.com/questions/122362/how-to-empty-flush-windows-read-disk-cache-in-c – Anuraj

0

嘗試包括WriteThrough標誌以及在列表|運營商。有關使用FILE_FLAG_NO_BUFFERING的要求,請參閱此KB。有趣的是MS沒有在枚舉中包含這個標誌。在這種情況下,WriteThrough不能滿足您的需求嗎?您正在嘗試編寫安全數據?

+0

@AnthonyWJones:我試過這個,但我仍然得到這個錯誤。我想實現的是這樣的:我必須通過文件(例如cmd.bin)設備向USB發出一些命令,並且它會在文件(例如res.bin)中返回一些響應。但是,如果我使用正常的C#流Windows將緩存響應,並始終我會得到相同的響應,所以我必須使用無緩衝標誌。這些文件是臨時的,所以我必須在使用後刪除它;這就是爲什麼我使用Delete On close標誌。 – Anuraj

+0

在這種情況下,Yuriy向您發出的問題有不同的方法來打開這樣的文件,我會放棄這個問題。 – AnthonyWJones