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

請問如何知道檔案是否還未存取完畢??

尚未結案
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-19 23:37:15 IP:211.74.xxx.xxx 未訂閱
各位先進好,最近小弟實做上有個困難點,想請教各位要怎麼做會比較好 問題如下: 我開一個A程式,裡面有個Multi Thread來監看底下的一個子目錄,一但此子目錄有檔案,則呼叫一個副程式來讀檔,但現在問題來了,那個副程式只知道有檔案在此目錄下(使用FindFile的方式),但卻不知道此檔案是否已經讀寫完畢了,這樣就會發生,檔案還未存取完畢,副程式就已經讀檔完成,變成副程式讀的檔(文字檔)是不完全的,請問這要怎麼實作才會比較好??還是有另外的方式來做會比較好??小弟是新手,對API也只略懂一些,希望各位高手多多指教,感激不盡
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-20 23:19:43 IP:203.204.xxx.xxx 未訂閱
請參考: http://delphi.ktop.com.tw/topic.php?topic_id=26986    沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-21 03:03:48 IP:211.74.xxx.xxx 未訂閱
dllee您好: 我看了他的文章,發現並未提及我要的功能,還是我有看錯的地方 我的實作,大致上就是監看一個子目錄(使用FindFirstChangeNotification與FindNextNotification函式),一但此子目錄有增加檔案(使用MsgWaitForMultiple Object來觸發thread,thread會呼叫副程式來但現在問題是,我使用FindFirstChange的方式,只能監看目錄有沒有檔案產生,但不代表檔案已經完全寫入完畢,所以一但檔案在寫入一半時,thread已經呼叫副程式起來讀取檔案內容,這時就會造成檔案讀取不完整,這使用上面的這個連結有辦法解決嗎??我怎麼看了半天還是覺得只是純粹的開檔而已??
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-21 09:00:37 IP:203.204.xxx.xxx 未訂閱
引言: dllee您好: 我看了他的文章,發現並未提及我要的功能,還是我有看錯的地方 我的實作,大致上就是監看一個子目錄(使用FindFirstChangeNotification與FindNextNotification函式),一但此子目錄有增加檔案(使用MsgWaitForMultiple Object來觸發thread,thread會呼叫副程式來但現在問題是,我使用FindFirstChange的方式,只能監看目錄有沒有檔案產生,但不代表檔案已經完全寫入完畢,所以一但檔案在寫入一半時,thread已經呼叫副程式起來讀取檔案內容,這時就會造成檔案讀取不完整,這使用上面的這個連結有辦法解決嗎??我怎麼看了半天還是覺得只是純粹的開檔而已??
不錯不錯, hagar 版主所用的方法就是開檔而已,在 Windows 的開檔方式中德的 AccessMode 設定可以設定檔案是否可以被同時存取,或是只允許可以讓別人同時讀,或只允許別人寫但不能讀,或是完全不允許別人可以讀寫。 而判斷一個檔是否已經被使用但沒有關閉,就是對那個檔案作「開檔」的動作,同時指定 AccessMode 是別人不可以讀也不可以寫,只有我可以讀也可以寫。這樣,當這個檔案可以正常開啟時,就表示沒有其他函式在使用,如果有其他函式在使用,則會傳回 INVALID_HANDLE_VALUE 表示開檔不成功!當然開檔不成功也有可能是檔案本來就不存在,所以 hagar 版主在一開始就有判斷檔案存不存在。 其實,解決的方法有很多種,因為您把問題指定檔案是否處理完成,所以我想 hagar 版主的方式就可以解決。 如果所有的程式都是您自己開發,則問題可以是兩個(以上)的程式或執行緒之間資料、訊息交換的問題,在此您只需在處理檔案的執行緒或程式在處理檔案是發一個訊息給其他模組去收,或將一個旗標打開讓別人可以存取,例如另開一個檔案作資料交換或用 ■【發表】跨行程共享記憶體 - Memory mapping file http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37041 或 ■【Delphi】【分享】ShareMemRep 1.0 - 最佳的共享內存管理器替代方案 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=35228 都可以。等處理檔案的執行緒處理完檔案,再以同樣的方式通知其他模組。 這樣,就不需要以「開檔」的方式來判斷檔是是否已處理完畢。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-22 00:26:49 IP:211.74.xxx.xxx 未訂閱
請問一下dllee版主,那個Access mode有三個值,一個是GENERIC_READ,GENERIC_WRITE,還有0 但是看他的解釋,只有可以限制檔案可不可以讀取,或是可不可以寫入,沒有看到自己可以讀寫,別的程式不能讀寫,是否還要再設其他如share mode的值??還是Share mode要設為0??
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-22 08:56:03 IP:61.224.xxx.xxx 未訂閱
以下擷取自 BCB5 的 Online Help
引言: FileOpen Opens a specified file using a specified access mode. Unit Sysutils Category file management routines extern PACKAGE int __fastcall FileOpen(const AnsiString FileName, int Mode); Description Use FileOpen to open a file and obtain its Windows file handle. The access mode value is constructed by or-ing one of the fmOpen constants with one of the fmShare constants defined in File open mode constants. If the return value is positive, the function was successful and the value is the file handle of the opened file. A return value of -1 indicates that an error occurred.
引言: File open mode constants File open mode constants are used to control the access mode to a file or stream. Unit Sysutils Category file management routines static const Shortint fmOpenRead = 0x0; static const Shortint fmOpenWrite = 0x1; static const Shortint fmOpenReadWrite = 0x2; static const Shortint fmShareCompat = 0x0; static const Shortint fmShareExclusive = 0x10; static const Shortint fmShareDenyWrite = 0x20; static const Shortint fmShareDenyRead = 0x30; static const Shortint fmShareDenyNone = 0x40; Description The file open mode constants are used when a file or stream is opened to control how it can be shared. The TFileStream constructor has a Mode parameter that you can set to one of these constants: Constant Definition fmOpenRead Open for read access only. fmOpenWrite Open for write access only. fmOpenReadWrite Open for read and write access. fmShareCompat Compatible with the way FCBs are opened. fmShareExclusive Read and write access is denied. fmShareDenyWrite Write access is denied. fmShareDenyRead Read access is denied. fmShareDenyNone Allows full access for others.
Windows API CreateFile 的說明請參考 MSDN http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/createfile.asp 那個 sharemode 是 0 就表示不能分享。 而所謂的 share 指的是可不可以同時 access ,包含同一程式內不同函式或是不用程式都算。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
系統時間:2024-05-04 7:07:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!