我正在构建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);
}
听起来你只想将所有文件从一个文件夹复制到另一个文件夹.第二个例子就是这样做的.