基于变化上传文件的智能方式

时间:2013-07-24 19:02:08

标签: android inotify fileobserver

我的应用必须关注目录的文件更改,并在进行更改时上传副本。为此,我使用了FileObserver。我将它上传到Creation,Move To,Close Write和Modify。问题在于修改。每次将更改写入磁盘时都会调用Modify,如果文件很大(被复制或大量更改)不是原子的,那么它会触发数百个Modify事件,这会让我的应用程序因为尝试上传而烦恼很多次,它崩溃了。我的第一个想法是删除修改事件,这样它只会在调用Close Write时上传。不幸的是,这并不总是被称为。所以我有点坚持修改。所以我的问题是:在检测文件修改结束时是否有最佳实践?我需要在修改完文件时上传此文件,而不是在同时修改。你会怎么做呢?如何发现上次Modify事件的触发时间。我是否必须制作复杂的计时器系统,或者是否有更简单的方法。 (如果没有,你能告诉我制作这样一个计时器系统的最佳做法吗?)

我知道我已经问了很多,但我很欣赏任何头脑风暴和想法。

谢谢!

编辑:所以我发现了一些奇怪的东西。至少在Android 4.2上,Open永远不会触发,因此close永远不会触发。只是一个FYI。

3 个答案:

答案 0 :(得分:1)

如果文件是基于文本的,您可以对原始文件和修改后的文件进行区分,并且只有在不同行的数量足够大时才上传文件。

答案 1 :(得分:1)

使用工作线程测试文件每x秒更改一次,如果更改,则将更新后的版本发送到您需要的任何位置。避免发送正在为File.isOpen编写测试文件或使用布尔值来跟踪发生的更改。

答案 2 :(得分: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)