[英]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.