【问题标题】:How to differentiate one file with the same file after content modified to make versions of file in Java修改内容以在Java中制作文件版本后如何区分一个文件与相同文件
【发布时间】:2015-08-18 16:01:58
【问题描述】:

我创建了一个场景,例如签入和签出文档。然后如何管理和检查用户签入文档是新签入还是现有文档签入。我们可以根据哪些文件属性来区分这一点。我不想使用文件的 lastModifiedTime、Size 或名称。请告诉我。谢谢..

【问题讨论】:

  • 为什么不对文件内容进行hash,这就是Git等版本控制系统采用的方法

标签: java


【解决方案1】:

当我有这样的事情要做时,我尝试使用 MD5 哈希(在 perl 中)。我认为这可能会有所帮助: How can I generate an MD5 hash?

【讨论】:

  • 感谢 MD5 哈希技术,但如果进行了一些更改,那么如何识别该用户修改了同一文件?
  • 您想找出“哪个用户”修改了它?或者“具有不同MD5的文件”是同一个文件还是完全不同的文件?
  • 是两者,哪个用户和“具有不同MD5的文件”是同一个或完全不同的文件。我的目标是:我必须下载一个文件,然后对其进行修改并上传相同的文件,但是在上传时如何检查我是否上传了带有一些修改内容的相同下载文件
  • 是的,让我印象深刻的第一件事是您可能需要类似 inode 的东西,但您说的是 downloading a file 所以它可能是一个多样化的环境,我认为这会有所帮助:http://stackoverflow.com/questions/7162164/does-windows-have-inode-numbers-like-linux.
  • 我没有通过此链接获得任何与我相关的信息,但谢谢。请举一些例子来满足我的情况。
【解决方案2】:

md5 文件编码将帮助您解决此问题。 This is 一个如何获取 MD5 值的工作示例。

public static void main(String[] args)throws Exception
{
    MessageDigest md = MessageDigest.getInstance("MD5");
    FileInputStream fis = new FileInputStream("c:\\loging.log");

    byte[] dataBytes = new byte[1024];

    int nread = 0; 
    while ((nread = fis.read(dataBytes)) != -1) {
      md.update(dataBytes, 0, nread);
    };
    byte[] mdbytes = md.digest();

    //convert the byte to hex format method 1
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < mdbytes.length; i++) {
      sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
    }

    System.out.println("Digest(in hex format):: " + sb.toString());

    //convert the byte to hex format method 2
    StringBuffer hexString = new StringBuffer();
    for (int i=0;i<mdbytes.length;i++) {
        String hex=Integer.toHexString(0xff & mdbytes[i]);
        if(hex.length()==1) hexString.append('0');
        hexString.append(hex);
    }
    System.out.println("Digest(in hex format):: " + hexString.toString());
}

输出:

Digest(in hex format):: e72c504dc16c8fcd2fe8c74bb492affa
Digest(in hex format):: e72c504dc16c8fcd2fe8c74bb492affa

你要做的就是将旧的 MD5 值与新的值进行比较,如果一致,则文件没有进行任何更改

【讨论】:

  • 但是如果对文件进行了一些更改,那么如何识别该用户修改了同一个文件?因为我在同一个文件上运行 MD5,我会得到不同的 HEX 代码
  • 我不明白...如果我有 MD5 值为 a1a1a1a1 的文件并且用户更改了文件,那么 MD5 值也会更改,例如更改为 a2a2a2a2。由于 MD5 旧值 (a1a1a1a1) 与 MD5 新值 (a2a2a2a2) 不同,我知道有人做了一些更改
  • 完全正确。但是,如果我将一些其他文件传递给 MD5 散列而不是我进行更改的文件,那么如何识别我传递的这个文件不是我进行更改的那个文件?
  • 嗯,你必须以某种方式识别文件......使用特定文件夹,或文件名或数据库中的引用
  • 我的目标是:我必须下载一个文件,然后修改它并上传相同的文件,但是在上传时如何检查我是否上传了相同的下载文件,其中包含一些修改过的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 2011-01-26
  • 2017-01-06
  • 1970-01-01
相关资源
最近更新 更多