全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1397
推到 Plurk!
推到 Facebook!

讀取網路磁碟檔案無法及時更新

尚未結案
鈴鐺
初階會員


發表:33
回覆:81
積分:35
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-09 13:50:45 IP:202.145.xxx.xxx 未訂閱
我在 Solaris Server 端, 以下面方式多執行幾次將檔案慢慢變大
echo "test" >> /share/test.dat
server 端用 samba server 放給 client 端的 x: 在 Windows Client 端, 以簡單的 fopen,fread 永遠持續讀取
    FILE *fp;
    char buf[8192];
    int  n,i=0;        fp=fopen("x:\test.dat", "rb");
    while (!Application->Terminated) {
      n=fread(buf, 1, sizeof(buf), fp);
      i =n;
      edOff->Text = IntToStr(i);
      Application->ProcessMessages();
      Sleep(100);
    }
    fclose(fp);
結果發現, server 端更新了, windows 端在檔案總管看到長度有增加, 但程式碼卻讀不到新增的資料. 我試過改用 open/read 系列, 或 _rtl_open, _rtl_read 系列函數, 仍然失敗.不知道有沒有人碰過類似的問題呢?
powmien
初階會員


發表:27
回覆:80
積分:41
註冊:2004-10-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-09 18:19:14 IP:60.248.xxx.xxx 未訂閱
會不會是因為只fopen一次. 所以 FILE point 在memory的資料一直是固定的呢? 雖然一直即時 fread... 但是對應到的 FILE point 卻一直是固定的... 前輩不妨寫個小程式做一下實驗… 別去讀clinet 的.. 讀hdd的就好.. 看會不會自動讀取到最新的呢? 新手的小小建議。
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-09 21:08:14 IP:211.22.xxx.xxx 未訂閱
紅色的地方寫錯了,造成檔案沒有開啟~
 fp=fopen("x:\\test.dat", "rb");
 while (!feof(fp)) 
 {
  n=fread(buf, 1, sizeof(buf), fp);
  i =n;
  edOff->Text = IntToStr(i);
  Application->ProcessMessages();
  Sleep(100);
 }
 fclose(fp);
---------------------------------------------- We will either find a way, or make one. -Hannibal -。
鈴鐺
初階會員


發表:33
回覆:81
積分:35
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-10 11:27:22 IP:202.145.xxx.xxx 未訂閱
修正一下, 我當時測試時用 "x:test.dat", 打到這裡筆誤, 我試過, 在 Solaris(Unix) 端, 用 fopen 系列是不行的, 改用 open/read 即可. 另外在 windows 端用 FindFirst 去找, 該檔案長度確實增加, 但是, 用 read 就是讀不到, 即使重新 open 也是要等大概 10-15 秒才收到( my pc is win XP, 應該不算低檔的慢機器).
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-10 21:19:22 IP:211.22.xxx.xxx 未訂閱
我沒有你實作的環境,再推測下去也沒有很大的意義,但還是提出幾個檢查的方向: 1.請檢查你的檔案指標是否為NULL,來確定你確實開啟了檔案。 2.據我的工作經驗,如果已經開啟了檔案,但讀不出資料,極有可能檔案的內容有誤,造成程式跳出,沒有關閉檔案。以你兩種不同的作業系統工作環境,Solaris產生的檔案,但由MS Windows的作業系統來讀取,是否因為檔案內的字碼意義(控制碼不同)造成衝碼,而使得讀取檔案發生錯誤? 以上請參考~ ----------------------------------------------
鈴鐺
初階會員


發表:33
回覆:81
積分:35
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-11 08:41:06 IP:202.145.xxx.xxx 未訂閱
Stallion, 謝謝你的回應, 不過你完全將問題想成我程式寫錯. 事實上這是簡化過的程式, 我程式會檢查每個傳回值, 而且假設原始檔案長度為 10 0000 bytes, buffer 那麼第一次會讀到 8192 bytes, 下一圈會將剩下的讀完, 而後一直等新資料進來, 且內容完全正確. 我的問題是接下來在遠端電腦 append 資料進去, 此時沒辦法即時讀到更新的資料. 你可以試著用 windows 分享資料夾的環境來測試. 我猜測結果應該也是這樣.
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-11 21:58:17 IP:211.22.xxx.xxx 未訂閱
我想到的問題與思考方向: Server端ECHO數次訊息加入檔案後,是否就停止?而由Client端的程式來進行讀取。還是不斷有機制來加入訊息至檔案,且Client不斷同時的讀取?    如果是加入訊息至檔案後就停止,由Client來讀取,應該不會有你所說的問題。有可能的是Server不斷有機制來加入訊息至檔案且Client不斷同時的讀取,如果是,我想你是違反了檔案分享鎖定的原則,因為當test.dat首次被client開啟後,既定的檔案尾(EOF)已經確定,那怕你Server端繼續加入訊息,Client端也不知道「它」長大了。所以在兩邊檔案新增與讀取之間,應該注意到鎖定的問題,也就是在有一程式新增資料時,注意另一個程式不要開啟檔案讀取,反之亦然,畢竟你的檔案不是資料庫伺服器,作業系統也不會幫你做鎖定的事情。 當然,檔案鎖定,關閉後被另一程式新增後又再開啟讀取,又牽扯了很多注意事項,不好在這裡三言兩語說明,這裡只是提供你可能造成的情形。請參考! ----------------------------------------------
鈴鐺
初階會員


發表:33
回覆:81
積分:35
註冊:2002-03-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-16 08:15:31 IP:202.145.xxx.xxx 未訂閱
Stallion, 謝謝, 我就是要模擬不斷有機制來加入訊息至檔案,且Client不斷同時的讀取. 因為確保是 single writer, multiple reader, 且以檔案持續成長方式, 因此可略去 lock 機制, 提升 performance. I've tried open with shared flags, but still failed. on unix, I don't need open with shared flags. Its just simple by using the 'open','read' and 'read' even till EOF tech.
系統時間:2024-11-22 19:55:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!