Hi 大家好
想請有什麼方法可以在批次檔內,檢查檔案是否有被覆寫嗎?
目前用了一隻批次檔來讀取檔案中的一個值,
但過程中須透過另一隻程式來轉檔較耗時,所以有讀過的資料就不再去重新轉檔讀出
可是有時檔案會覆寫,而批次檔已認為有讀過就不在動作
導致資料無法更新
而資料本身因為是開啟狀態,所以無法用改檔名的方式來判斷是否有覆寫
只有想到用dir/TW來做檔案的比對,但最小單位是一分鐘,還是太久了,無法即時更新
不知有無能即時檢查的方法?
謝謝 ^_^
by2 wrote:
Hi 大家好想請有什...(恕刪)
我照你的描述(因為你的描述有點難懂) ,批次檔需要在檔案(假設是檔案A)中讀一個值,可是這個值
"會需要另一個程式(叫轉檔程式好了)經過轉換資料,然後重新放在檔案A裡"
偏偏你的批次檔已經讀過一次檔案A了,所以批次檔無法知道檔案A的內容被更新
以上我的邏輯對嗎?
如果我的邏輯是對得,其實你的問題很簡單,就是你需要"當轉檔程式轉出新資料後,批次檔程式需要知道或做出反應",你的問題就是系統概論所提到的 " IPC " (行程間通訊)
我會如下做,我放棄使用檔案A作為批次檔與轉檔程式之間的資料媒介,而是使用 "管線"作為批次檔與轉檔程式之間的資料通道(或是 #通知# 的通道)
相信你一定知道"管線"以及windows 批次檔中"管線"的意義.如果不清楚,可以詢問google
呼! 這是我在01發過最coding的文了

您解釋的邏輯是正確的
在跑的程式跟轉檔程式,都不是我能修改的
程式執行一次就會存檔一次(程式是一直開啟,只是重新點界面上的執行按鈕)
存檔檔名是依測試條件存固定的檔名
而批次檔的用意是在即時將有用的資料取出,表列示的顯示在視窗上
批次檔是被動檢查有存檔,就執行轉檔跟取值
例如顯示
A=
B=
C=
|(直到)
Z=
..........
但因為轉檔較耗時,所以只要有取過值的檔案,就不再去重讀,以增加速度
而每次重讀資料(轉檔+解析取值)就不會有這個問題,但隨著資料量增加
每次都重讀會花很久的時間,不符合即時顯示的需求
因為跑過的條件有時會重跑並覆寫存檔
所以才想說加一個判斷條件
若有取過值,但檔案有被覆寫過,還是會重新讀該筆資料(轉檔+解析取值)
可保有速度的即時與資料的正確性
但我忽略了你的環境是windows環境,所以無法在那些程式上再套一個殼(感謝*nix,沒這種困擾)
我不太會寫windows程式.但有關 file overwrite notify 的功能,我想是可以達成的.你想想看,那些 word , excel ,UltraEdit 等程式都會知道他目前編輯的檔案被其他程式更動,然後問使用者要不要更新,所以windows應該含有此機制,只是我不知道實際的API funcion name 是啥.但我可以斷定的是,在批次檔是無法實現這個機制的.要實現這個機制,一定要呼叫到windows底層 API code 才能達成.
我會這樣做
1)寫一個合乎windows file overwrite notify 規範的C code.
2)這個C code 在你想偵測的那些檔案被更改的時候,就會被windows 系統所通知
3)一旦被windows系統通知,這個時候C code 馬上用某種方法通知批次檔程式(用管線啦,還是其他IPC通道都可以,隨你)
4)批次檔被C code 所通知,知道哪些檔案被overwrite了,重新轉檔&取值
(ps) 這個方法仍然要改動批次檔程式,但我想這是最接近你的要求的流程了,而且批次檔是明文,可改動.相關細節跟知識可以問google
如果以上方法還是不行,你只剩一條路,就是最笨的"每隔一段時間去檢查檔案A的最後修改時間是否被改變了",這是最不得已的.如果無計可施,你也只能接受這最爛的方法.
最後,我覺得你是在寫跟資料庫有關的程式.(老屁股的直覺)