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

重復讀取不斷更新的文字檔案內容

答題得分者是:小傑克
MrAlmost
一般會員


發表:1
回覆:1
積分:0
註冊:2009-08-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-08-01 15:53:18 IP:122.100.xxx.xxx 訂閱
各位大大:

小弟現在有一個問題:有一個別人開發的程式不斷(每隔2-4秒,不太定時,視數據而定)產生數據到同一個檔案中,檔案內容為現時的數據,之前的數據不會被保留在檔案中。

我的工作是開發一個程式去讀取數據檔案,之後再處理以及顯示出來。我的方法是使用一個while loop 及用FileGetDate(hfile1),去比對檔案的更新時間,以決定檔案是否已被重新寫入。程式碼如下:


[code delphi]
procedure TForm1.Timer1Timer(Sender: TObject);
var
hfile1: HWND;
fileDate : integer;
FileCreateTime, OldFileCreateTime : string;

begin
hfile1:=CreateFile(PChar('C:\aaa.dat'),GENERIC_READ ,0,nil,OPEN_EXISTING ,0,0 );
fileDate := FileGetDate(hfile1);
OldFileCreateTime := inttostr(filedate);
closehandle(hfile1);


hfile1:=CreateFile(PChar('C:\aaa.dat'),GENERIC_READ ,0,nil,OPEN_EXISTING ,0,0 );
fileDate := FileGetDate(hfile1);
FileCreateTime := inttostr(filedate);
closehandle(hfile1);

while (FileCreateTime = OldFileCreateTime) do
begin
hfile1:=CreateFile(PChar('C:\aaa.dat'),GENERIC_READ ,0,nil,OPEN_EXISTING ,0,0 );
fileDate := FileGetDate(hfile1);
FileCreateTime := inttostr(filedate);
closehandle(hfile1);
if (FileCreateTime = '-1') then
FileCreateTime := OldFileCreateTime;
//memo2.Lines.Add('Data is ' FileCreateTime);
end;

process_data;

end;
[/code]

可是現在的問題是,有時候數據檔案讀不出來,數據內容為空白的。懷疑是產生數據的程式同時在寫入,導致讀取到並不是最終的資料。小弟try了好久,仍解決不了問題,故特請教各位大大,對於這種重復讀取不斷更新的文字檔案內容的工作,有什麼比較好的處理方式?
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-08-01 17:17:17 IP:115.43.xxx.xxx 訂閱
提供一些建議給你參考
1.我想你可以先偵錯你的程式,在邏輯上是不是有問題
2.解決程式問題後在估計,你的 process_data 大約需多少時間
有沒有 lose 資料的可能性,或是造成來源程式無法寫入的錯誤發生
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-08-02 22:56:41 IP:122.126.xxx.xxx 訂閱
補充上面答覆...

1. CreateFile 查 Help
dwShareMode 值 If dwShareMode is 0, the object cannot be shared
取日期可用 FileAge(FileName) 判斷 若需轉換可用 FileDatetoDateTime

2. 若要判斷是否正在寫入
讀取前 CreateFile 做為判斷,若資料不大 以一次性載入較佳。
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-08-05 15:04:22 IP:59.115.xxx.xxx 訂閱
之前有人做過用API 監控路徑變化,相同的方法應該可以對檔案作業(推測...)

http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=92396

當有變化的時候會獲取一個event , 可以在那個時候複製一份檔案到另依個地方然後讀出,這樣
大概可以避過 filehandle 卡住的問題(純想像....沒實做不確定)
------
額有朝天骨,眼中有靈光
MrAlmost
一般會員


發表:1
回覆:1
積分:0
註冊:2009-08-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-08-07 22:25:05 IP:122.100.xxx.xxx 訂閱
感謝各位大大的幫忙以及提示,小弟使用下列的元件,

http://atorg.net.ru/delphi/atfilenotification.htm

現在問題已解決了!
系統時間:2024-05-02 5:35:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!