簡體   English   中英

CFile :: osNoBuffer標志寫入文件時導致異常

[英]CFile::osNoBuffer flag causes exception when writing to file

(WINAPI創建文件-WINAPI寫入文件)當我使用winapi函數寫入文件時,在winapi(FILE_FLAG_NO_BUFFERING)中使用的標志工作正常。

(WINAPI創建文件-CFile-寫入文件)在這種情況下也發生了錯誤,但這是由於CFile對象中缺少文件名所致,而該文件名是從winapi CreateFile函數接收到的文件句柄創建的。

(CFile創建文件 -Cfile- 寫文件 )當我使用此標志(CFile :: osNoBuffer)時,當我嘗試向文件中寫入內容時出現異常,告訴我發生了一些無法識別的錯誤。

有什么問題嗎?

char chArr [] = "1234567890";
CFile file;
file.Open("c:\\mfc.txt",CFile::modeCreate| CFile::modeNoTruncate| CFile::modeWrite | CFile::osNoBuffer | CFile::osWriteThrough);
file.Write(chArr,sizeof(chArr)); // exception 
file.Flush(); 
file.Close();

請參閱有關MSDN上文件緩沖的討論。

使用標志CFile::osNoBuffer打開文件,或將標志FILE_FLAG_NO_BUFFERING傳遞給CreateFile ,是寫入文件的一種特殊方法。 它要求將用於寫入文件的所有緩沖區與內存中的扇區邊界對齊,並且僅寫入扇區大小的整數倍。 除非您已采取特殊步驟來對齊要傳遞的緩沖區(您在此處沒有),並且還至少寫入了512個字節,否則除非設備靜默忽略您的標志,否則它將無法正常工作。 我認為您可能沒有注意到WriteFile返回錯誤代碼而不是引發異常。

我會問:為什么要指定此標志? 它的使用是相當專業的,如果你只是在做正常的日常文件I / O,就像寫一個文本文件,那么你應該指定該標志。 它可能會減慢您的程序的速度,並使其變得更加復雜。 我還建議您刪除CFile::osWriteThrough

就像您知道的那樣: FILE_FLAG_NO_BUFFERING幾乎僅用於寫大量必須直接進入磁盤的數據,例如實時數據記錄或視頻記錄應用程序。 FILE_FLAG_WRITE_THROUGH用於諸如數據庫日志文件之類的事情,必須在每次寫入后刷新它們,以確保事務的正確性。 在其他情況下,禁用這些緩存和緩沖區通常會降低程序速度。

這是另一個討論相同問題的人的討論 (盡管他們使用的是.NET,而不是C ++)。

編輯:感謝您提到大小要求達里爾。

在MSDN文件緩沖討論中,道格在回答中提到了..

  • 文件訪問大小(包括OVERLAPPED結構中的可選文件偏移)(如果已指定)必須為字節數,該字節數是卷扇區大小的整數倍。 例如,如果扇區大小為512字節,則應用程序可以請求512、1,024、1,536或2,048字節的讀寫,但不能請求335、981或7,171字節的讀寫。

  • 用於讀取和寫入操作的文件訪問緩沖區地址應按扇區對齊,這意味着在內存中的地址上對齊,該地址是卷扇區大小的整數倍。 根據磁盤的不同,可能不會強制執行此要求。

在我的系統上,正在更改...

char chArr[] = "1234567890";

char chArr[512] = "1234567890";

...擺脫了異常,但是出現了一個明顯的問題,即我正在將一堆未初始化的垃圾字節寫入文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM