2012-01-28 25 views
1

我工作的一些加密程序,需要做一些緩衝的文件寫入。無緩衝文件寫入的內容是兼容Unicode編碼和交叉開發平臺

我不知道我可以使用什麼功能這一點。

要清楚,我實現了寫一個回調函數,用於讀取的回調函數,當OS的任何第三方應用程序要寫入或從硬盤讀取這些將處理寫或讀。

需要:
- 我需要使用具有unicode名稱的文件。
- 我需要以無緩衝模式寫入。
- 我需要爲Windows,Linux,Mac做到這一點。

我使用C++和Qt。雖然QFile確實有以非緩衝模式打開文件的語法,但文檔卻說它不適用於Windows(也就是說,QFile在Windows中始終處於緩衝模式)。

這導致我的程序崩潰是由於到Windows延遲寫入錯誤。理想情況下,我不希望爲每種類型的操作系統使用單獨的函數(+ lib),但是我意識到我的選擇在尋求跨平臺兼容性方面可能不太好。無論如何,我期待着建議,以我應該使用什麼功能,爲每個平臺如果不存在一個可以爲所有3

+1

你的意思是無緩衝的?用戶空間中沒有緩衝區?操作系統沒有緩衝?沒有硬盤緩衝? – 2012-01-28 22:12:36

+0

通過unbuffered我的意思是寫入應儘快發生,而不會將寫入請求彙集到緩衝區中,以期儘量減少I/O。當我打電話寫信時,我需要它真正寫入硬盤。所以在這方面,我想跳過所有可以跳過的緩衝區。問題我不能跳過硬盤,但可能沒問題。我不希望OS做延遲寫入。 – user440297 2012-01-28 22:22:15

回答

2
  • 對於Windows做到這一點,你需要CreateFile()功能與FILE_FLAG_NO_BUFFERING標誌。
  • 在Linux上,你需要open()O_DIRECT選項,但注意只有自2.4.10內核,它是支持的。
  • 在OS X上,每次寫入後需要撥打fsync()

但是我必須警告你,無緩衝的I/O不會使磁盤I/O最小化,並且很可能會降低應用程序的性能。除非您真的知道自己在做什麼,否則不要直接進行I/O操作,瞭解操作系統緩衝如何影響性能,並明確解釋爲什麼無緩衝I/O會更快。如果您仍想繼續操作,請不要忘記在之前和之後測量性能。你做了錯誤的優化,甚至使事情變得更糟的機會,有9個滿分10分

至於支持Unicode - 沒關係。寫需要一個內存地址和一些字節來寫入。您可以編寫unicode,ASCII碼,任何二進制數據等。如果使用Unicode,您只需記住不要將字符串長度與字符串大小混淆。

祝你好運!

+0

謝謝弗拉德。我會嘗試你的建議。幾個意見很快。關於unicode,我知道我寫的並不重要,當我說unicode兼容時,我的意思是我打開的文件的名稱可以寫入它的名稱爲unicode。因此,如果open函數不支持unicode字符,它將無法打開文件(獲取文件的句柄),以便我可以寫入它。例如fstream :: open()不能用unicode文件名打開文件。這與你爲Linux推薦的「open()」是一樣的嗎? – user440297 2012-01-28 23:19:37

+0

@ user440297:不,你在說什麼是包裝。我對他們不是很熟悉。 'open()'是一個POSIX系統調用。無論你使用什麼,它將在一天結束時調用open()來打開一個文件。無論是否支持Unicode,也取決於文件系統驅動程序。例如,OS X HFS支持它,但仍然有其侷限性。在Linux中,無需編寫任何特殊代碼即可在整個系統中支持unicode,因此您根本無需擔心。然而,Windows是個例外。有'CreateFile'函數,它有兩個等價物 – 2012-01-29 14:58:35