【问题标题】:Smart way of uploading files based on changes基于更改上传文件的智能方式
【发布时间】:2013-07-24 19:02:08
【问题描述】:

我的应用程序必须监视目录的文件更改,并在进行更改时上传副本。为此,我使用了FileObserver。我将它上传到创建、移动到、关闭写入和修改。问题在于修改。每次将更改写入磁盘时都会调用 Modify很多次,它崩溃了。我的第一个想法是删除修改事件,以便仅在调用 Close Write 时上传。不幸的是,这并不总是被调用。所以我有点坚持修改。所以我的问题是:在检测文件修改结束时是否有最佳实践?我需要在修改完成后上传此文件,而不是同时。你会怎么做呢?如何发现最后一个 Modify 事件何时触发。我是否必须制作一个复杂的计时器系统,或者有更简单的方法。 (如果没有,你能告诉我制作这样一个计时器系统的最佳做法吗?)

我知道我已经问了很多,但如果有任何头脑风暴和想法,我将不胜感激。

谢谢!

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

【问题讨论】:

    标签: android inotify fileobserver


    【解决方案1】:

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

    【讨论】:

    • File.isOpen()?如果我能找到它,那听起来很有用。你在说什么,这是某种图书馆?
    • 使用 FileObserver 并跟踪打开/关闭事件。您还可以使用 FileLock developer.android.com/reference/java/nio/channels/FileLock.html 来确保对文件的相互访问。如果您的文件是按顺序访问的,请使用布尔变量。
    • 好吧,我做了...这样的。我使用 hashmap 和 timertask 将多个事件限制为十秒延迟。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 基于文本的文件实际上是可以正常工作的。它们通常是触发修改和关闭写入一次的原子操作。
    • 创意+1,没想到这一点。如果所有文件都严格基于文本,它会起作用。但他们不是。
    【解决方案3】:

    如果运气好的话,可能会做一些事情,比如跟踪修改事件之间的时间,假设它们或多或少一致地收到......

     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)
    

    【讨论】:

      猜你喜欢
      • 2014-02-19
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      相关资源
      最近更新 更多