Pular para o conteúdo principal

Sincronizar duas pastas com PHP

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

Comentários

  1. Bom dia...Consigo com esse script comparar duas pastas uma local na minha maquina com uma area de FTP?

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Lista de órgãos emissores de RG

Para quem quiser normalizar os órgãos emissores de RG, aí vai uma lista retirada do site da FGV: SSP - Secretaria de Segurança Pública PM - Polícia Militar PC - Policia Civil CNT - Carteira Nacional de Habilitação DIC - Diretoria de Identificação Civil CTPS - Carteira de Trabaho e Previdência Social FGTS - Fundo de Garantia do Tempo de Serviço IFP - Instituto Félix Pacheco IPF - Instituto Pereira Faustino IML - Instituto Médico-Legal MTE - Ministério do Trabalho e Emprego MMA - Ministério da Marinha MAE - Ministério da Aeronáutica MEX - Ministério do Exército POF - Polícia Federal POM - Polícia Militar SES - Carteira de Estrangeiro SJS - Secretaria da Justiça e Segurança SJTS - Secretaria da Justiça do Trabalho e Segurança ZZZ - Outros (inclusive exterior)

Função php que gera número romano

/**  * Funcao que serve para transformar o numero em romano  * @param integer $integer Recebe algum numero inteiro  * @return string Retorna a string do numero romano  */ function fRomano($integer) {     $table = array('M'=>1000, 'CM'=>900, 'D'=>500, 'CD'=>400, 'C'=>100, 'XC'=>90, 'L'=>50, 'XL'=>40, 'X'=>10, 'IX'=>9, 'V'=>5, 'IV'=>4, 'I'=>1);     $return = '';     while($integer > 0) {         foreach($table as $rom=>$arb) {             if($integer >= $arb) {                 $integer -= $arb;                 $return .= $rom;                 break;             }         }     }     return $return; }