Criei a classe abaixo para sincronizar duas pastas utilizando PHP.
No meu caso eu a utilizo para atualizar todo dia meu código fonte no dropbox. É bem mais rápido que o copiar e colar do Windows.
Criei um filtro de extensões para analisar apenas os arquivos que me interessavam, mas se colocar array() todos os tipos serão sincronizados.
A classe também exclui do destino o que não mais há na origem.
Na comparação entre os arquivos eu analiso o hash dos dois, se for diferente eu substituo.
Espero que gostem...
class sincronizarPastas{
private $origem;
private $destino;
private $ar_extensao = array();
private $ar_arquivos = array();
private $qt_analisado = 0;
private $qt_copiado = 0;
private $qt_excluido = 0;
function __construct($origem, $destino, $ar_extensao = array()) {
$this->origem = $origem;
$this->destino = $destino;
$this->ar_extensao = $ar_extensao;
$this->sincronizar();
$this->excluirDestino();
echo '<br />QT. ARQUIVO ANALISADO: '.$this->qt_analisado;
echo '<br />QT. ARQUIVO COPIADO: '.$this->qt_copiado;
echo '<br />QT. ARQUIVO EXCLUÍDO: '.$this->qt_excluido;
}
public function listaArquivoRecursivo($no_pasta) {
$iterator = new RecursiveDirectoryIterator($no_pasta);
$recursiveIterator = new RecursiveIteratorIterator($iterator);
$ar_arquivo = array();
foreach ( $recursiveIterator as $entry ) {
$ar_arquivo[] = str_replace("\\", "/", $entry->getPathname());
}
return $ar_arquivo;
}
public function sincronizar() {
$this->ar_arquivos = $this->listaArquivoRecursivo($this->origem);
$qt_arquivo = count($this->ar_arquivos);
for ($cont = 0; $cont < $qt_arquivo; $cont++) {
if (is_file($this->ar_arquivos[$cont])) {
$this->copyFile($this->ar_arquivos[$cont]);
}
}
}
/**
* Exclui no destino o que nao tem mais na origem
*/
public function excluirDestino() {
$ar_arquivos_destino = $this->listaArquivoRecursivo($this->destino);
$qt_arquivo = count($ar_arquivos_destino);
for ($cont = 0; $cont < $qt_arquivo; $cont++) {
if (is_file($ar_arquivos_destino[$cont])) {
$origem = str_replace($this->destino, $this->origem, $ar_arquivos_destino[$cont]);
if (!file_exists($origem)) {
unlink($ar_arquivos_destino[$cont]);
$this->qt_excluido++;
echo '<br />EXCLUÍDO '.$this->completarComZero($this->qt_excluido, 4).' - '.$ar_arquivos_destino[$cont];
}
}
}
}
public function copyFile($arquivo) {
if (in_array($this->extensao($arquivo), $this->ar_extensao) && $this->ar_extensao != array()) {
$this->qt_analisado++;
$destination = str_replace($this->origem, $this->destino, $arquivo);
if (file_exists($destination)) {
$originalHash = md5_file($arquivo);
$destinationHash = md5_file($destination);
if ($originalHash === $destinationHash) {
return FALSE;
}
}
$this->rmkdir($destination);
copy($arquivo, $destination);
$this->qt_copiado++;
echo '<br />COPIADO '.$this->completarComZero($this->qt_copiado, 4).' - '.$destination;
return TRUE;
}
}
public function completarComZero($numero, $tamanho_final) {
return str_pad($numero, $tamanho_final, "0", STR_PAD_LEFT);
}
public function extensao($arquivo) {
$nome = explode('.', $arquivo);
return strtolower(end($nome));
}
public function rmkdir($path, $mode = 0777) {
$path = dirname($path);
if (!is_dir($path)) {
mkdir($path, $mode, TRUE);
}
}
}
// MODO DE UTILIZAÇÃO
$origem = "C:/wamp/www/sistema";
$destino = "C:/Users/Usuário/Dropbox/sistema";
$ar_extensao = array('php','js');
$sincronizar = new sincronizarPastas($origem, $destino, $ar_extensao);
No meu caso eu a utilizo para atualizar todo dia meu código fonte no dropbox. É bem mais rápido que o copiar e colar do Windows.
Criei um filtro de extensões para analisar apenas os arquivos que me interessavam, mas se colocar array() todos os tipos serão sincronizados.
A classe também exclui do destino o que não mais há na origem.
Na comparação entre os arquivos eu analiso o hash dos dois, se for diferente eu substituo.
Espero que gostem...
class sincronizarPastas{
private $origem;
private $destino;
private $ar_extensao = array();
private $ar_arquivos = array();
private $qt_analisado = 0;
private $qt_copiado = 0;
private $qt_excluido = 0;
function __construct($origem, $destino, $ar_extensao = array()) {
$this->origem = $origem;
$this->destino = $destino;
$this->ar_extensao = $ar_extensao;
$this->sincronizar();
$this->excluirDestino();
echo '<br />QT. ARQUIVO ANALISADO: '.$this->qt_analisado;
echo '<br />QT. ARQUIVO COPIADO: '.$this->qt_copiado;
echo '<br />QT. ARQUIVO EXCLUÍDO: '.$this->qt_excluido;
}
public function listaArquivoRecursivo($no_pasta) {
$iterator = new RecursiveDirectoryIterator($no_pasta);
$recursiveIterator = new RecursiveIteratorIterator($iterator);
$ar_arquivo = array();
foreach ( $recursiveIterator as $entry ) {
$ar_arquivo[] = str_replace("\\", "/", $entry->getPathname());
}
return $ar_arquivo;
}
public function sincronizar() {
$this->ar_arquivos = $this->listaArquivoRecursivo($this->origem);
$qt_arquivo = count($this->ar_arquivos);
for ($cont = 0; $cont < $qt_arquivo; $cont++) {
if (is_file($this->ar_arquivos[$cont])) {
$this->copyFile($this->ar_arquivos[$cont]);
}
}
}
/**
* Exclui no destino o que nao tem mais na origem
*/
public function excluirDestino() {
$ar_arquivos_destino = $this->listaArquivoRecursivo($this->destino);
$qt_arquivo = count($ar_arquivos_destino);
for ($cont = 0; $cont < $qt_arquivo; $cont++) {
if (is_file($ar_arquivos_destino[$cont])) {
$origem = str_replace($this->destino, $this->origem, $ar_arquivos_destino[$cont]);
if (!file_exists($origem)) {
unlink($ar_arquivos_destino[$cont]);
$this->qt_excluido++;
echo '<br />EXCLUÍDO '.$this->completarComZero($this->qt_excluido, 4).' - '.$ar_arquivos_destino[$cont];
}
}
}
}
public function copyFile($arquivo) {
if (in_array($this->extensao($arquivo), $this->ar_extensao) && $this->ar_extensao != array()) {
$this->qt_analisado++;
$destination = str_replace($this->origem, $this->destino, $arquivo);
if (file_exists($destination)) {
$originalHash = md5_file($arquivo);
$destinationHash = md5_file($destination);
if ($originalHash === $destinationHash) {
return FALSE;
}
}
$this->rmkdir($destination);
copy($arquivo, $destination);
$this->qt_copiado++;
echo '<br />COPIADO '.$this->completarComZero($this->qt_copiado, 4).' - '.$destination;
return TRUE;
}
}
public function completarComZero($numero, $tamanho_final) {
return str_pad($numero, $tamanho_final, "0", STR_PAD_LEFT);
}
public function extensao($arquivo) {
$nome = explode('.', $arquivo);
return strtolower(end($nome));
}
public function rmkdir($path, $mode = 0777) {
$path = dirname($path);
if (!is_dir($path)) {
mkdir($path, $mode, TRUE);
}
}
}
// MODO DE UTILIZAÇÃO
$origem = "C:/wamp/www/sistema";
$destino = "C:/Users/Usuário/Dropbox/sistema";
$ar_extensao = array('php','js');
$sincronizar = new sincronizarPastas($origem, $destino, $ar_extensao);
Bom dia...Consigo com esse script comparar duas pastas uma local na minha maquina com uma area de FTP?
ResponderExcluir