java 板


LINE

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 也有人点出效能的问题 以上是我尝试过的几种方式, 不知道有没有其他我没想过的做法可以提供参考 跪谢 -- 不菸不酒,没有朋友 有菸有酒,癌症好友 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.224.100.95
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1470329900.A.A79.html
1F:推 ripple0129: public void observe(){ copyingFile(); notifyDone() 08/05 01:56
2F:→ ripple0129: ;} 08/05 01:56
谢谢 可以详述一下这是怎麽做的吗@@? 只有两个function name 我参悟不出来 Orz ※ 编辑: love112302 (61.224.100.95), 08/05/2016 08:45:11
3F:→ ripple0129: 简单来说你写copy的那个method最後一行加个通知完成 08/05 09:11
4F:→ ripple0129: 的method 08/05 09:11
5F:→ ripple0129: 不过不太确定你的写法适合吗,我是都用古老的copy写法 08/05 09:13
6F:→ ripple0129: 。 08/05 09:13
Hi, 谢谢您的意见, 但是 copy档案这个部分不是我做的 是使用者自行丢档案到特定资料夹, 所以好像没办法这样做 @@?
7F:→ dennisxkimo: 那是侦测档案异动 不适合你的需求 08/05 11:50
8F:→ dennisxkimo: 如果丢档的行为 也是靠你的程式处理 那就很简单单纯 08/05 11:51
9F:→ dennisxkimo: 而且至少还能掌握大档丢完後的完整性 08/05 11:56
10F:→ dennisxkimo: 写批次也能做到 复制完 %errorlevel%跟起始时间出log 08/05 12:03
谢谢 想请问批次是指 batch? 不好意思这块不太熟, 我原本也是想用 batch 来监看资料夹, 如果copy完成, 执行特定的 jar 档案, 但因为command line 指令不熟放弃 T__T ※ 编辑: love112302 (114.46.155.75), 08/05/2016 15:27:26
11F:推 cowbaying: WatchService 通常会配一个杂凑档... 08/05 16:17
12F:→ cowbaying: 重点是WatchService是事件驱动 比THREAD省资源 08/05 16:19
13F:推 cowbaying: 不过事件驱动的本质还是THREAD... 08/05 16:21
14F:→ cowbaying: 其实你如果执行绪够熟 也是能写的 08/05 16:21
15F:→ cowbaying: 看你用sleep硬干就知道你应该不太熟 08/05 16:22
16F:→ cowbaying: 建议你还是把WatchService弄熟比较快 08/05 16:22
17F:推 cowbaying: 不好意思 没看清楚 你第一个方法应该是去检查两边 08/05 16:24
18F:→ cowbaying: 档案的MD5是不是一致这样就好了 08/05 16:25
19F:→ cowbaying: 档案能否写入跟OS实作FS的方式有关 所以这个方法不好 08/05 16:26
谢谢, 我对Thread 真的不熟...Orz 想请问检查MD5 的部分是指 来源 跟 复制档案的 md5 吗? 比方说: c:\source\from.big.file.txt 跟 d:\des\from.big.file.txt 这两个档案的 md5 吗? 还是 ? 谢谢您的回覆
20F:→ bitlife: 其实正本清源是要有protocol,以现在你描述的现况,你根本 08/05 17:09
21F:→ bitlife: 无法检查何谓档案copy好了. 必须有个明确的协定,例如使用 08/05 17:09
22F:→ bitlife: 者可先在其他暂存目录建立好档案,然後用move的方式,这样 08/05 17:10
23F:→ bitlife: 目标目录下的档案一出现就是完整的. 又或者使用者copy完 08/05 17:10
24F:→ bitlife: 档案,就touch一个特定格式档名,这样看到这个特定档也可确 08/05 17:11
25F:→ bitlife: 定copy完成,这个标记用档案处理完由你的程式删除即可 08/05 17:12
26F:→ bitlife: 补充一下我所谓你无法确定档案是否copy完了的意思是,除非 08/05 17:14
27F:→ bitlife: 你事先知道(或可计算)档案完整长度,否则你无法确定档案目 08/05 17:15
28F:→ bitlife: 前是已copy完成,还是对方程式只是刚好停顿档案短时间没再 08/05 17:15
29F:→ bitlife: 有内容变动 08/05 17:16
※ 编辑: love112302 (114.46.155.75), 08/05/2016 18:02:34 谢谢您~ 但是我没有办法要求使用者的动作 他们只想要把档案拉进去这个资料夹就没事了 Orz 我是有看到有人使用 File.length() 的方式, 然後几秒没有更新, 就判断 File is ready 但是我在 WatchService 里面用 Path.toFile().length() 每次都是 0 T___T ※ 编辑: love112302 (114.46.155.75), 08/05/2016 18:05:29
30F:推 haha02: 你可以看一下File的API https://goo.gl/ChHnPB 08/05 19:18
31F:→ haha02: 他有说有些情况会回传0 08/05 19:19
32F:推 cowbaying: 感觉像是网芳或者FTP这种单向的 08/05 19:49
33F:→ cowbaying: WatchService 一开始会检测到CREATE事件 档案传完会 08/05 19:50
34F:→ cowbaying: 检测到MODIFY事件 其实这样就蛮简单了 08/05 19:51
35F:→ cowbaying: 除非你规定他们传档时要有加个验证档案 MD5或SHA的 08/05 19:53
36F:→ cowbaying: 这样你後端就能检查档案完整性 08/05 19:53
谢谢, 想请问 即使是抓到 create 跟 modify 事件, 要如何判断 因为我在最後一次触发 Modify 的时候 去检查档案 File.canWrite() or File.length() 都没有用 :(
37F:→ ripple0129: 我觉得3的方式可行啊,1个thread大多数的时间在睡觉 08/05 23:08
38F:→ ripple0129: 能吃什麽资源,不过多学WatchService也是好的。 08/05 23:08
但是就觉得是个技术债, 有一种迟早要还的感觉 XD 可能是因为死线还没到 所以还不愿意放行XD
39F:推 jej: 如果是别人做copy 不是就侦测copy的pie?? 08/05 23:12
谢谢 我来研究一下这是什麽意思XD
40F:推 qrtt1: jej 提供的思路挺棒的 08/06 19:00
※ 编辑: love112302 (61.224.156.163), 08/07/2016 22:46:43
41F:推 cowbaying: 我是根据其API来看的 08/07 23:31
42F:→ cowbaying: MODIFY的时机就是档案被改写 08/07 23:31
43F:→ cowbaying: 那档案什麽时候被改写 FILE IO结束的时侯 08/07 23:31
44F:→ cowbaying: FILE IO什麽时候结束? 资料中断或者写完的时候 08/07 23:32
45F:→ cowbaying: 所以我才会说如果是我所说的那种单向上传 08/07 23:32
46F:→ cowbaying: 你只能透过SHA或MD5来验证档案完整性 08/07 23:32
47F:→ cowbaying: WatchService只是监控IO的情况而已 08/07 23:33
※ 编辑: love112302 (61.224.156.163), 08/07/2016 23:36:17
48F:推 tacovirus: 欢迎来看原始码,稍候回文 08/25 00:52
49F:→ Chikei: 尝试去lock档案,其他程式copy当中你应该是不能lock的 08/27 22:40
50F:→ Chikei: 能lock就是copy完成了 08/27 22:40







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP