讀取網路磁碟檔案無法及時更新 |
尚未結案
|
鈴鐺
初階會員 發表:33 回覆:81 積分:35 註冊:2002-03-13 發送簡訊給我 |
我在 Solaris Server 端, 以下面方式多執行幾次將檔案慢慢變大
echo "test" >> /share/test.datserver 端用 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 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
紅色的地方寫錯了,造成檔案沒有開啟~
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 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
我沒有你實作的環境,再推測下去也沒有很大的意義,但還是提出幾個檢查的方向:
1.請檢查你的檔案指標是否為NULL,來確定你確實開啟了檔案。
2.據我的工作經驗,如果已經開啟了檔案,但讀不出資料,極有可能檔案的內容有誤,造成程式跳出,沒有關閉檔案。以你兩種不同的作業系統工作環境,Solaris產生的檔案,但由MS Windows的作業系統來讀取,是否因為檔案內的字碼意義(控制碼不同)造成衝碼,而使得讀取檔案發生錯誤?
以上請參考~ ----------------------------------------------
|
鈴鐺
初階會員 發表:33 回覆:81 積分:35 註冊:2002-03-13 發送簡訊給我 |
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
我想到的問題與思考方向:
Server端ECHO數次訊息加入檔案後,是否就停止?而由Client端的程式來進行讀取。還是不斷有機制來加入訊息至檔案,且Client不斷同時的讀取? 如果是加入訊息至檔案後就停止,由Client來讀取,應該不會有你所說的問題。有可能的是Server不斷有機制來加入訊息至檔案且Client不斷同時的讀取,如果是,我想你是違反了檔案分享鎖定的原則,因為當test.dat首次被client開啟後,既定的檔案尾(EOF)已經確定,那怕你Server端繼續加入訊息,Client端也不知道「它」長大了。所以在兩邊檔案新增與讀取之間,應該注意到鎖定的問題,也就是在有一程式新增資料時,注意另一個程式不要開啟檔案讀取,反之亦然,畢竟你的檔案不是資料庫伺服器,作業系統也不會幫你做鎖定的事情。
當然,檔案鎖定,關閉後被另一程式新增後又再開啟讀取,又牽扯了很多注意事項,不好在這裡三言兩語說明,這裡只是提供你可能造成的情形。請參考!
----------------------------------------------
|
鈴鐺
初階會員 發表:33 回覆:81 積分:35 註冊:2002-03-13 發送簡訊給我 |
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.
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |