[问题] 侦测大型档案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