2013-07-24 45 views
1

我的应用程序来监视文件更改到一个目录,然后上传副本每当更改。为此,我已经使用了FileObserver。我已将它上传到创建,移动到,关闭写入和修改。问题在于修改。修改被称为每次更改写入磁盘时,如果文件较大(被复制或很多改变)不是原子,因此触发数百修改的事件,这使我的应用程序怪胎,因为它试图上传等等很多次,它崩溃。我的第一个想法是删除修改事件,以便它只会在调用Close Write时上传。不幸的是,这并不总是被称为。所以我有点卡住修改。所以我的问题是这样的:在检测文件修改结束时是否有最佳做法?我需要上传这个文件,当它被修改时,而不是。你会如何去做这件事?我怎样才能发现上次修改事件被触发的时间。我是否必须制作一个复杂的计时器系统,还是有一个更简单的方法。 (如果没有,你能告诉我做出这样的计时器系统的最佳实践?)智能方式

我知道我问了很多,但我会很感激任何头脑风暴和想法。

谢谢!

编辑:所以,我已经发现了一些奇怪的。至少在Android 4.2上,Open从不会触发,因此close绝不会触发。仅供参考。

回答

1

使用工作线程测试文件为每x秒的变化,如果发生变化,然后发送更新后的版本,无论你需要的。避免发送正在编写的文件测试File.isOpen或使用布尔值来跟踪发生的更改。

+0

'File.isOpen()'?如果我能找到它,这听起来很有用。你在说什么,这是某种图书馆? –

+0

使用FileObserver并跟踪打开/关闭事件。您还可以使用FileLock http://developer.android.com/reference/java/nio/channels/FileLock.html确保相互访问该文件。如果您的文件是按顺序访问的,则使用布尔变量。 –

+0

好的,我做了...这个。我使用hashmap和timertask将多个事件瓶颈到十秒钟的延迟。谢谢! –

1

如果文件是基于,你也许可以diff的原始文件和修改过的文件,只上传文件,如果不同线路的数量是足够大的文本。

+0

基于文本文件实际上是工作的人精细。它们通常不是触发修改和关闭写入一次的原子操作。 –

+0

+1为创造性,但没有想到这一点。如果所有文件都是严格基于文本的,那么它就会奏效。他们不是。 –

1

随着一点点运气,人们可能会做一些像跟踪修改事件之间的时间,假设他们收到更多或更少的一贯...

last-notification = now; 
notification-interval = 1 s; /* some default */ 
listen for (file closed); 
listen for (file modified); 
alarm at (now + notification-interval); 

on (file modified) = 
     cancel alarm; 
     notification-interval = max (notification-interval 
            | [now - last-notification]); 
     alarm at (now + 2 × notification-interval); 

on (file closed) = 
     cancel alarm; 
     do upload; 

on (alarm) = 
     if (file is open?) then alarm at (now + 2 × notification-interval); 
     else (signal file closed)