2010-05-06 19 views
3

我使用Windows,MySQL數據庫,PHP如何在PHP中同步兩個文件夾?

我建立的Joomla組件,其一個的功能是 我要同步不同名稱的兩個文件夾..我如何能做到這一點的文件夾同步?它在同一臺機器,沒有兩個不同的服務器都參與了它被DNE ..

如何在PHP中同步兩個文件夾?

修訂

亞歷克斯的語境回覆

如果我在編輯一個文件夾中的所有.jpg文件,並因爲它具有相同的名稱保存,也該文件已經存在於其他文件夾。我想把這張編輯過的照片轉移到另一個文件夾中。?我也有Joomla的嵌套文件結構要比較

更新2

我有一個遞歸函數將輸出文件夾我的完整結構...如果u可以只用它來Concat的UR解決方案在...

<? 
function getDirectory($path = '.', $ignore = '') { 
    $dirTree = array(); 
    $dirTreeTemp = array(); 
    $ignore[] = '.'; 
    $ignore[] = '..'; 

    $dh = @opendir($path); 

    while (false !== ($file = readdir($dh))) { 

     if (!in_array($file, $ignore)) { 
      if (!is_dir("$path/$file")) { 
       $stat = stat("$path/$file"); 
       $statdir = stat("$path"); 
       $dirTree["$path"][] = $file. " === ". date('Y-m-d H:i:s', $stat['mtime']) . " Directory == ".$path."===". date('Y-m-d H:i:s', $statdir['mtime']) ; 

      } else { 

       $dirTreeTemp = getDirectory("$path/$file", $ignore); 
       if (is_array($dirTreeTemp))$dirTree = array_merge($dirTree, $dirTreeTemp); 
      } 
     } 
    } 
    closedir($dh); 

    return $dirTree; 
} 


$ignore = array('.htaccess', 'error_log', 'cgi-bin', 'php.ini', '.ftpquota'); 

$dirTree = getDirectory('.', $ignore); 
?> 
<pre> 
    <? 
    print_r($dirTree); 
    ?> 
</pre> 

回答

5

我只是跑這一點,似乎工作

function sync() { 

    $files = array(); 
    $folders = func_get_args(); 

    if (empty($folders)) { 
     return FALSE; 
    } 

    // Get all files 
    foreach($folders as $key => $folder) { 
     // Normalise folder strings to remove trailing slash 
     $folders[$key] = rtrim($folder, DIRECTORY_SEPARATOR); 
     $files += glob($folder . DIRECTORY_SEPARATOR . '*');  
    } 

    // Drop same files 
    $uniqueFiles = array(); 
    foreach($files as $file) { 
     $hash = md5_file($file); 

     if (! in_array($hash, $uniqueFiles)) { 
      $uniqueFiles[$file] = $hash; 
     } 
    } 


    // Copy all these unique files into every folder 
    foreach($folders as $folder) { 
     foreach($uniqueFiles as $file => $hash) { 
       copy($file, $folder . DIRECTORY_SEPARATOR . basename($file)); 
     } 
    } 
    return TRUE;  
} 

// usage 

sync('sync', 'sync2'); 

有司mply給它一個要同步的文件夾列表,它會同步所有文件。它將嘗試跳過出現的文件相同(即其散列相沖突的文件)。

然而,這並不考慮最後修改日期或任何東西。你將不得不修改自己來做到這一點。它應該很簡單,看看filemtime()

另外,抱歉,如果代碼糟透了。我在使它遞歸了個去,但我失敗了:(

對於單向複製,試試這個

$source = '/path/to/source/'; 
$destination = 'path/to/destination/'; 

$sourceFiles = glob($source . '*'); 

foreach($sourceFiles as $file) { 

    $baseFile = basename($file); 

    if (file_exists($destination . $baseFile)) { 

     $originalHash = md5_file($file); 
     $destinationHash = md5_file($destination . $baseFile); 
     if ($originalHash === $destinationHash) { 
      continue; 
     } 

    } 
    copy($file, $destination . $baseFile); 
} 

這聽起來像你只是想將所有文件複製從一個文件夾到另一個。該第二個例子中會做到這一點

+0

這是一個不錯的代碼。 – Bingy 2010-05-06 07:02:56

+0

@Alex請CHK按照烏拉圭回合的答覆更新的問題... – 2010-05-06 07:04:23

+0

@OM上午一個更好的版本的工作,因爲我們說話 – alex 2010-05-06 07:06:45

0

如果它的一個Linux/POSIX的系統,然後在(取決於你所擁有的訪問),可能很多簡單/快:

$chk=`rsync -qrRlpt --delete $src $dest`; 

C.

+0

我希望如果在全世界只有這些系統..沒有窗戶沒有門...... :)但阿拉斯,我有窗戶... – 2010-05-06 10:05:40

+0

位遲了,但總是有cygwin;) – PaulM 2012-02-27 17:29:26

1

我用這個,它似乎工作,也使新的目錄,如果不存在.....

//sync the files and folders 

function smartCopy($source, $dest, $options=array('folderPermission'=>0755,'filePermission'=>0755)) 
{ 
    //$result = false; 
    if (is_file($source)) { 

     if ($dest[strlen($dest)-1]=='/') { 
      if (!file_exists($dest)) { 
       cmfcDirectory::makeAll($dest,$options['folderPermission'],true); 
      } 
      $__dest=$dest."/".basename($source); 
     } else { 
      $__dest=$dest; 
     } 
     $result = copy($source, $__dest); 
     chmod($__dest,$options['filePermission']); 

    } elseif(is_dir($source)) { 
     if ($dest[strlen($dest)-1]=='/') { 
      if ($source[strlen($source)-1]=='/') { 
       //Copy only contents 
      } else { 
       //Change parent itself and its contents 
       $dest=$dest.basename($source); 
       @mkdir($dest); 
       chmod($dest,$options['filePermission']); 
      } 
     } else { 
      if ($source[strlen($source)-1]=='/') { 
       //Copy parent directory with new name and all its content 
       @mkdir($dest,$options['folderPermission']); 
       chmod($dest,$options['filePermission']); 
      } else { 
       //Copy parent directory with new name and all its content 
       @mkdir($dest,$options['folderPermission']); 
       chmod($dest,$options['filePermission']); 
      } 
     } 

     $dirHandle=opendir($source); 
     while($file=readdir($dirHandle)) 
     { 
      if($file!="." && $file!="..") 
      { 
       if(!is_dir($source."/".$file)) { 
        $__dest=$dest."/".$file; 
       } else { 
        $__dest=$dest."/".$file; 
       } 
       echo "$source/$file ||| $__dest<br />"; 
       $result=smartCopy($source."/".$file, $__dest, $options); 
      } 
     } 
     closedir($dirHandle); 

    } else { 
     $result=false; 
    } 
    return $result; 
} 
//end of function 

echo smartCopy('media', 'mobile/images'); 
1
function recurse_copy($src,$dst) { 
    $dir = opendir($src); 
    @mkdir($dst); 
    while(false !== ($file = readdir($dir))) { 
     if (($file != '.') && ($file != '..')) { 
     if (is_dir($src . '/' . $file)) { 
      recurse_copy($src . '/' . $file,$dst . '/' . $file); 
     } 
     else { 
      if(md5_file($src . '/' . $file) !== md5_file($dst . '/' . $file)) 
      { 
       echo 'copying' . $src . '/' . $file; echo '<br/>'; 
       copy($src . '/' . $file, $dst . '/' . $file); 
      } 
     } 
     } 
    } 
closedir($dir); 
}