如何在PHP中同步两个文件夹?

我正在使用Windows,Mysql DB,PHP

我正在构建Joomla组件,其功能之一是同步文件夹
我想同步两个不同名称的文件夹..我该怎么做?它必须在同一台机器上,没有两个不同的服务器参与其中.

如何在PHP中同步两个文件夹?

更新

在Alex回复的背景下

如果我正在编辑一个文件夹中的任何.jpg文件并使用相同名称保存它,该文件是否已存在于其他文件夹中.我希望这个编辑过的图片转移到另一个文件夹.我也有Joomla的嵌套文件,可以进行比较

更新2

我有一个递归函数,它将输出文件夹的完整结构…如果你可以使用它来连接你的解决方案…

<?
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> 

解决方法:

我跑了这个,似乎工作

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');

您只需给它一个要同步的文件夹列表,它就会同步所有文件.它将尝试跳过看起来相同的文件(即它们的哈希碰撞的文件).

但是,这并未考虑最近修改日期或任何内容.你必须修改自己才能做到这一点.它应该非常简单,请查看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);
}

听起来你只想将所有文件从一个文件夹复制到另一个文件夹.第二个例子就是这样做的.

上一篇:让AJAX调用等待php中的事件


下一篇:Java在线程启动之前发生