[問題] 偵測大型檔案copy完成

作者: love112302 (小黑炭)   2016-08-05 00:58:17
Hi all, 想請問大家都怎麼偵測大檔案copy完成了呢?
使用情境是:
user丟大型檔案到指定資料夾 > 抓到這個事件 > 做其他事情
問題點:
現在卡在"抓到這個事件"有點不太好處理, 想請各位版友分享類似經驗
已嘗試方法:
1) 透過 nio 的 WatchService
這個方法基本上就是google的第一種解法, 透過 nio 的 WatchService,
註冊 ENTRY_MODIFY/ENTRY_CREATE 可偵測到檔案有變動or新增
但無法無法知道何時copy完成
2) 在 nio 的 WatchService 判斷
天真如我, 在每次 ENTRY_MODIFY 事件發生時, 將 Path 轉為 File,
判斷檔案是否可用
File f = path.toFile();
if(f.canWrite()){ ... }
會用 canWrite() 判斷是因為有爬到說在copy時檔案不能編輯
這個方法我一直覺得可能是我哪邊寫錯了, 因為我覺得應該要可以 Orz
3) 定時爬一次資料夾
這是土炮, 也是唯一成功的一種...
for(;;){ ...; Thread.sleep(5000); }
不想用這種方法的原因是, 類似的回答在 stackoverflow 被推到 -1x
也有人點出效能的問題
以上是我嘗試過的幾種方式, 不知道有沒有其他我沒想過的做法可以提供參考
跪謝
作者: ripple0129 (perry tsai)   2016-08-05 01:56:00
public void observe(){ copyingFile(); notifyDone();}簡單來說你寫copy的那個method最後一行加個通知完成的method不過不太確定你的寫法適合嗎,我是都用古老的copy寫法。
作者: dennisxkimo (Dennis(一上B就糟糕))   2016-08-05 11:50:00
那是偵測檔案異動 不適合你的需求如果丟檔的行為 也是靠你的程式處理 那就很簡單單純而且至少還能掌握大檔丟完後的完整性寫批次也能做到 複製完 %errorlevel%跟起始時間出log
作者: cowbaying (是在靠北喔)   2016-08-05 16:17:00
WatchService 通常會配一個雜湊檔...重點是WatchService是事件驅動 比THREAD省資源不過事件驅動的本質還是THREAD...其實你如果執行緒夠熟 也是能寫的看你用sleep硬幹就知道你應該不太熟建議你還是把WatchService弄熟比較快不好意思 沒看清楚 你第一個方法應該是去檢查兩邊檔案的MD5是不是一致這樣就好了檔案能否寫入跟OS實作FS的方式有關 所以這個方法不好
作者: bitlife (BIT一生)   2016-08-05 17:09:00
其實正本清源是要有protocol,以現在你描述的現況,你根本無法檢查何謂檔案copy好了. 必須有個明確的協定,例如使用者可先在其他暫存目錄建立好檔案,然後用move的方式,這樣目標目錄下的檔案一出現就是完整的. 又或者使用者copy完檔案,就touch一個特定格式檔名,這樣看到這個特定檔也可確定copy完成,這個標記用檔案處理完由你的程式刪除即可補充一下我所謂你無法確定檔案是否copy完了的意思是,除非你事先知道(或可計算)檔案完整長度,否則你無法確定檔案目前是已copy完成,還是對方程式只是剛好停頓檔案短時間沒再有內容變動
作者: haha02 (來人!上夾棍!)   2016-08-05 19:18:00
你可以看一下File的API https://goo.gl/ChHnPB他有說有些情況會回傳0
作者: cowbaying (是在靠北喔)   2016-08-05 19:49:00
感覺像是網芳或者FTP這種單向的WatchService 一開始會檢測到CREATE事件 檔案傳完會檢測到MODIFY事件 其實這樣就蠻簡單了除非你規定他們傳檔時要有加個驗證檔案 MD5或SHA的這樣你後端就能檢查檔案完整性
作者: ripple0129 (perry tsai)   2016-08-05 23:08:00
我覺得3的方式可行啊,1個thread大多數的時間在睡覺能吃什麼資源,不過多學WatchService也是好的。
作者: jej (晃奶大馬桶)   2016-08-05 23:12:00
如果是別人做copy 不是就偵測copy的pie??
作者: qrtt1 (有些事,有時候。。。)   2016-08-06 19:00:00
jej 提供的思路挺棒的
作者: cowbaying (是在靠北喔)   2016-08-07 23:31:00
我是根據其API來看的MODIFY的時機就是檔案被改寫那檔案什麼時候被改寫 FILE IO結束的時侯FILE IO什麼時候結束? 資料中斷或者寫完的時候所以我才會說如果是我所說的那種單向上傳你只能透過SHA或MD5來驗證檔案完整性WatchService只是監控IO的情況而已
作者: tacovirus (小璋丸)   2016-08-25 00:52:00
歡迎來看原始碼,稍候回文
作者: Chikei ( )   2016-08-27 22:40:00
嘗試去lock檔案,其他程式copy當中你應該是不能lock的能lock就是copy完成了

Links booklink

Contact Us: admin [ a t ] ucptt.com