【问题标题】:How can I judge whether the file (read from dropbox webpage) has been changed or not in Java?如何判断文件(从保管箱网页读取)是否已在 Java 中更改?
【发布时间】:2013-01-24 01:45:09
【问题描述】:

现在我正在用 Java 做分布式系统作业,所以我需要从几台计算机访问一份配置文件。现在我可以从 Dropbox 网页读取和解析共享文件,例如:https://www.dropbox.com/s/ysn9yivqj7kwo0w/config.yaml。 我想要做的是添加一个守护线程来检测这个文件是否被改变了,如果改变了,我需要重新配置系统的每个节点。

但是我如何判断这个文件是否在程序中被改变了,而不是下载整个文件然后做一些差异呢?我认为保管箱应该在文件中添加时间戳之类的东西,但是我怎样才能访问这个时间戳呢?

欢迎任何建议,非常感谢!

【问题讨论】:

    标签: java dropbox last-modified


    【解决方案1】:

    我会查看 content-md5。因此,您保留以前版本的 md5,如果它们不匹配,则下载该文件。

    【讨论】:

    • 您好,保罗,感谢您的建议。我知道你的意思,但是我怎么能在不获取整个文件的情况下计算 md5 呢?如果没有任何改变,我不想下载整个文件。那么你的意思是我可以访问 Dropbox 提供的 md5 吗?
    • 在下载文件之前检查标题。寻找“内容-MD5”
    • 太棒了!非常感谢!我试试看!
    • 您好 Paul,我已经尝试过您所说的,但我从标头中得到的列表如下:null--->[HTTP/1.1 200 OK] cache-control--->[ max-age=0] etag--->[35n] Date--->[Thu, 24 Jan 2013 02:06:28 GMT] Content-Length--->[1188] accept-ranges--->[ bytes] Content-Type--->[text/plain; charset=ascii] Connection--->[keep-alive] Server--->[nginx/1.2.6] pragma--->[public] There's no content-md5.....也许我误会了你?你能更具体一点吗?再次感谢!
    • 我不认为 Etag 与 MD5 相同,这意味着您无法在本地副本上计算 MD5,然后将其与 Etag 进行比较,并期望在此基础上做出一些假设。如果我错了,请纠正我。
    【解决方案2】:

    如果您使用的是sdk form dropbox, 您可以通过

    获取文件的元数据
        meta = api.metadata(path, 1, null, false, null);
    

    并通过

    检查文件的最后修改日期或哈希
        meta.hash;
        meta.modified;
    

    【讨论】:

    • 阅读文档,哈希不是“文件的哈希”,它是元数据的哈希,因此 Dropbox 不必重新发送已经发送给客户端的信息。它不是文件本身内容的指示。
    【解决方案3】:

    解决方案 1

    根据API documentation/metadata 检索文件和文件夹元数据。比较哈希(md5)来检查

    网址结构https://api.dropbox.com/1/metadata/auto/<path>

    返回给定的文件或文件夹的元数据。如果表示一个文件夹并且 list 参数为 true,则元数据还将包括文件夹内容的元数据列表。

    在 Java 中使用

    来自Java SDK documentation

    public DbxEntry getMetadata(String path)
                         throws DbxException
    Get the file or folder metadata for a given path.
     DbxClient dbxClient = ...
     DbxEntry entry = dbxClient.getMetadata("/Photos");
     if (entry == null) {
         System.out.println("No file or folder at that path.");
     } else {
         System.out.print(entry.toStringMultiline());
     }
    

    参数

    path - 文件或文件夹的路径(参见 DbxPath)。

    退货

    如果给定路径有文件或文件夹,则返回该路径的元数据。如果那里没有文件或文件夹,则返回null。

    投掷

    DbxException

    更新

    解决方案 2(Hack 解决方法)

    不幸的是,Dropbox 不为文件提供哈希值,它只为目录提供哈希值。因此,如果您正在使用 Dropbox API 进行同步开发,您可以执行以下操作之一

    • 下载文件时,复制包含修订号的 rev 参数
    • 比较本地和云文件的最后修改(注意:不保证始终有效。如果 2 个人同时在本地同时编辑文件并且其中一个人覆盖草稿文件,您可能会得到错误积极)。

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 2015-11-15
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      相关资源
      最近更新 更多