討論區快速選單
知識庫快速選單
Excel也能做到大數據分析? 沒有人比Cloudera更了解大數據 討論區最近新進100則主題
[ 回上頁 ] [ 討論區發言規則 ]
請問即時存檔的問題?
更改我的閱讀文章字型大小
作者 : wang3529(兔妹) 貼文超過200則人氣指數超過10000點
[ 貼文 307 | 人氣 27736 | 評價 50 | 評價/貼文 0.16 | 送出評價 36 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/10/23 下午 09:50:33
我發現我寫檔案時
如果此時程式是正常關閉 檔案會正常寫入
如果是突然的當機或是斷電 檔案就會有時有寫入有時沒寫入
(就像我們使用隨身碟,有時候明明檔案已經顯示複製完成,要退出時卻告知隨身碟還在使用中,硬是拔掉偶爾會發現剛才檔案根本沒有複製完成)
我查看處理程式是已經到了fclose關檔案之後 才故意切斷電源
結果卻是常常沒寫進去
我在fclose之前加上了fflush也沒有任何作用
我用的是FILE的fopen開檔案
請問要怎麼確保程式跑到fclose關檔案時候檔案真的寫進去了
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人wang3529註記此篇回應為最佳解答 2016/10/24 上午 10:40:29
>我發現我寫檔案時
>如果此時程式是正常關閉 檔案會正常寫入
>如果是突然的當機或是斷電 檔案就會有時有寫入有時沒寫入
>(就像我們使用隨身碟,有時候明明檔案已經顯示複製完成,要退出時卻告知隨身碟還在使用中,硬是拔掉偶爾會發現剛才檔案根本沒有複製完成)

可以考慮用 LockHunter (http://lockhunter.com) 來找出檔案被鎖的原因.


>我查看處理程式是已經到了fclose關檔案之後 才故意切斷電源
>結果卻是常常沒寫進去
>我在fclose之前加上了fflush也沒有任何作用

在你的程式跟檔案中間, 還有一個東西叫「作業系統」, fclose() 後, 作業系統有可能會 cache 住資料, 稍後才真正寫出. 這也是你應該用作業系統提供的 eject 功能.

因為 cache 的關係, fflush() 及 fclose() 都無法確保資料已確實寫入, 要做到這一點, 你必須求助於作業系統.


>我用的是FILE的fopen開檔案

Linux 系統可用 fsync(), 視窗系統可用FlushFileBuffers().

注意:
1. 視窗系統必須用 _get_osfhandle(_fileno(pFile)) 把 FILE* 轉成 HANDLE.
2. 過度的使用 fsync() 或 FlushFileBuffers() 會影響系統的性能.


>請問要怎麼確保程式跑到fclose關檔案時候檔案真的寫進去了

即使如此, 這也不能 100% 保證沒問題. 因為如果儲存檔案的硬件本身還有 cache, 那不是你能控制的.

作者 : wang3529(兔妹) 貼文超過200則人氣指數超過10000點
[ 貼文 307 | 人氣 27736 | 評價 50 | 評價/貼文 0.16 | 送出評價 36 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/10/24 下午 04:23:55
>注意:
>1. 視窗系統必須用 _get_osfhandle(_fileno(pFile)) 把 FILE* 轉成 HANDLE.
>2. 過度的使用 fsync() 或 FlushFileBuffers() 會影響系統的性能.
>
我把FlushFileBuffers加在fflush與fclose中間
不過fflush似乎可以不用加了 反正也達不到我的要求
>>請問要怎麼確保程式跑到fclose關檔案時候檔案真的寫進去了
>
>即使如此, 這也不能 100% 保證沒問題. 因為如果儲存檔案的硬件本身還有 cache, 那不是你能控制的.
>
目前使用FlushFileBuffers有達到我的需求
不過同時有數個檔案存取使用FlushFileBuffers 真的挺影響效能的(很明顯看到畫面停頓一下)
目前是盡量讓不同檔案分散時間存取來避掉這樣的問題

非常感謝
作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4465 | 人氣 37262 | 評價 10860 | 評價/貼文 2.43 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/10/26 上午 08:22:58
basically , FlushFileBuffers flushes everything in the write-back cache. it is a high cost operation.
http://stackoverflow.com/questions/18308793/explanation-information-sought-windows-write-i-o-performance-with-fsync-flus
 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.140625