Пример синхронизации директорий (копирование отсутствующих файлов) на PHP
Пример скрипта:
<?php
namespace Disweb;
$patchFrom = __DIR__ . "/public/upload";
$patchTo = __DIR__ . "/public2/upload";
// Проверка на существование дирикторий и создание при отсутствии
function checkDirPath($path){
$path = str_replace(array("\\", "//"), "/", $path);
//remove file name
if(substr($path, -1) != "/"){
$p = strrpos($path, "/");
$path = substr($path, 0, $p);
}
$path = rtrim($path, "/");
if(!file_exists($path))
return mkdir($path, 0755, true);
else
return is_dir($path);
}
// Копирование файлов и дирикторий
function copyDirFiles($path_from, $path_to, $ReWrite = true, $Recursive = false, $DeleteAfterCopy = false, $strExclude = ""){
if(strpos($path_to."/", $path_from."/")===0 || realpath($path_to) === realpath($path_from)){
return false;
}
if(is_dir($path_from)){
checkDirPath($path_to."/");
}else if(is_file($path_from)){
$p = strrpos($path_to, "/");
$path_to_dir = substr($path_to, 0, $p);
checkDirPath($path_to_dir."/");
if (file_exists($path_to) && !$ReWrite)
return false;
@copy($path_from, $path_to);
if(is_file($path_to))
@chmod($path_to, 0644);
if ($DeleteAfterCopy)
@unlink($path_from);
return true;
}else{
return true;
}
if($handle = @opendir($path_from)){
while(($file = readdir($handle)) !== false){
if($file == "." || $file == "..")
continue;
if(strlen($strExclude) > 0 && substr($file, 0, strlen($strExclude)) == $strExclude){
continue;
}
if(is_dir($path_from."/".$file) && $Recursive){
copyDirFiles($path_from."/".$file, $path_to."/".$file, $ReWrite, $Recursive, $DeleteAfterCopy, $strExclude);
if ($DeleteAfterCopy)
@rmdir($path_from."/".$file);
}else if(is_file($path_from."/".$file)){
if(file_exists($path_to."/".$file) && !$ReWrite)
continue;
@copy($path_from."/".$file, $path_to."/".$file);
@chmod($path_to."/".$file, 0644);
if($DeleteAfterCopy)
@unlink($path_from."/".$file);
}
}
@closedir($handle);
if($DeleteAfterCopy)
@rmdir($path_from);
return true;
}
return false;
}
function folderFileCopy($path = "")
{
global $patchFrom, $patchTo;
echo "Копирование: " . $path . "\n";
copyDirFiles($patchFrom . $path, $patchTo . $path);
}
function folderListing($path = "")
{
global $patchFrom, $patchTo;
if (is_dir($p = $patchFrom . $path))
{
if ($dir = opendir($p))
{
while (false !== $item = readdir($dir))
{
if ($item == ".." || $item == ".")
{
continue;
}
if (!file_exists($patchTo . $path . "/" . $item))
{
folderFileCopy($path . "/" . $item);
}
else if (is_dir($patchFrom . $path . "/" . $item))
{
folderListing($path . "/" . $item);
}
}
}
}
}
folderListing("");
echo "success\n";