同步文件

时间:2012-02-27 12:15:28

标签: java php c++

我有一个项目,其中必须跨计算机同步文件。

我的问题是我的程序发出错误,执行时间超过30秒。

现在,我已经在php中创建了一个程序; 它的作用是将旧文件分成块并对每个块进行md5哈希并进行比较 它通过在任何偏移处动态地产生给定长度的哈希值来修改文件。(从修改文件的开始到结束)这样它就可以找到不需要传输的块。

任何一个人都有任何经验,建议,链接或代码非常欢迎.Thnx

p.s我可以使用php,java或c ++工作。

我给出的代码是用于测试目的,它从同一位置获取2个文件(一个修改过的文件,另一个是原始文件)从旧文件中获取块的哈希值,并将其与每个其他偏移量的新文件中的哈希值进行比较。希望这会有所帮助:

<html>
<body>
<?php  
   $k=0;
   $old_file = file_get_contents('11.jpg');
   $new_file = file_get_contents('12.jpg'); 
   $block_length = 2048;
   $j = 0;
   $md5_hashes_old = array();
   $md5_hashes_new = array();
   $diff_blocks = array(); 
   $first_char=array();
   $k = 0;
   while(1){
     if($j >strlen($old_file))
     break;
     $block = substr($old_file,$j,$block_length);
     $md5_hashes_old[$k] = md5($block);
     $first_char[$k]=$block[0];
     $j = $j+$block_length;
     $k++;
  } 
   $j = 0;
   $k = 0;
   $no_of_blocks = sizeof($md5_hashes_old);
   echo $no_of_blocks;
   $matched_blocks = array();
   $matched = 0;
   $fc=0;
   echo $md5_hashes_old[1].'</br>';
  for($i=0;$i<$no_of_blocks;$i++){
      $j =0;
      while(1){
    $block = substr($new_file,$j,$block_length);
    $md5_hash = md5($block);
    if($md5_hashes_old[$i] == $md5_hash){
        $match_block = array();
        $match_block['block_no'] = $i;
        $match_block['index'] = $j;
        array_push($matched_blocks,$match_block);
        break;
    }   
    else
        $j++;

    if($j > strlen($new_file))
        break;
    echo 'old='.$md5_hashes_old[$i].' i='.$i.' new='.$md5_hash.'</br>';
}       
}       
print_r($matched_blocks);   
?> 

</body>
</html>

2 个答案:

答案 0 :(得分:1)

增加超时是您的第一个停靠点。

我假设您只是在进行md5比较时,如果您有更新的修改日期并且文件长度不同。

如果您使用C ++,您可以使用文件系统观察程序在修改文件时收到通知,然后使用它来触发您的进程或触发创建哈希。

另一个技巧是缓存文件以制作二进制差异:

http://dev.chromium.org/developers/design-documents/software-updates-courgette

答案 1 :(得分:0)

你总是可以应用肮脏的伎俩:

<?php  set_time_limit(9999);  ?>

但我同意@aioobe,听起来像是一个彻底改造的rsync