<?php
 
// ----------------------------------------------------------------------
 
// Copyright (C) 2007 by Abdul-Aziz Al-Oraij.
 
// http://aziz.oraij.com/
 
// ----------------------------------------------------------------------
 
// LICENSE
 
 
// This program is open source product; you can redistribute it and/or
 
// modify it under the terms of the GNU General Public License (GPL)
 
// as published by the Free Software Foundation; either version 2
 
// of the License, or (at your option) any later version.
 
 
// This program is distributed in the hope that it will be useful,
 
// but WITHOUT ANY WARRANTY; without even the implied warranty of
 
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
// GNU General Public License for more details.
 
 
// To read the license please visit http://www.gnu.org/copyleft/gpl.html
 
// ----------------------------------------------------------------------
 
// Class Name: FTP Folder Copy/Delete
 
// Filename:   ftp.class.php
 
// Original    Author(s): Abdul-Aziz Al-Oraij <aziz.oraij.com>
 
// Purpose:    Copy to/Delete from FTP folders recursively.
 
// ----------------------------------------------------------------------
 
// Bismillah..
 
class ftp {
 
    var $conn_id;
 
    var $natij=array();
 
    var $orgDir;
 
 
    function ftp($ftp_server="localhost"){
 
        $this->conn_id = ftp_connect($ftp_server);
 
    }
 
    function connect($user, $pass, $path = "/"){
 
        if(@ftp_login($this->conn_id, $user, $pass) ) 
 
            return ftp_nlist($this->conn_id, $path);
 
        else
 
            return false;
 
    }
 
    function quit($conn_id = null ){
 
        $conn_id = $conn_id ==null ? $this->conn_id : $conn_id ;
 
        ftp_quit($conn_id);
 
    }
 
    function rmAll($dst_dir, $debug = 0){
 
        if(!$dst_dir) {
 
            return false;
 
            exit;
 
        }
 
        $dst_dir = preg_replace("/\\/\$/", "", $dst_dir); // remove trailing slash
 
        $ar_files = ftp_nlist($this->conn_id, $dst_dir);
 
        if (is_array($ar_files)){ // makes sure there are files
 
            if(count($ar_files)==1) // if its only a file
 
                return ftp_delete($this->conn_id, $ar_files[0]);
 
            else
 
                foreach ($ar_files as $st_file){ // for each file 
 
                    if ($st_file == "." || $st_file == "..") continue 1;
 
                    $fl_file = "$dst_dir/$st_file";
 
                    $ftp_size = ftp_size($this->conn_id, $fl_file );
 
                    if ($ftp_size == -1){ // check if it is a directory
 
                        $this->rmAll($fl_file); // if so, use recursion
 
                    }else{
 
                        if ($debug ) 
 
                            echo "File: $fl_file | $ftp_size\n";
 
                        else
 
                            ftp_delete($this->conn_id, $fl_file); // if not, delete the file
 
                    }
 
                }
 
        }
 
        if ($debug ) 
 
            echo "Dir: $dst_dir \n";
 
        elseif(count($ar_files)!=1)
 
            echo @ftp_rmdir($this->conn_id, $dst_dir) ? "$dst_dir deleted!\n":"Can't remove $dst_dir: No such file or directory"; // delete empty directories
 
    }
 
    function log($result) {
 
        if ($result == "print")
 
            foreach ($this->natij as $key => $value){
 
                if ($key == "site" || $key == "put" || $key == "mkdir")
 
                    echo "<font color=green>$value ".($key=="put"?"Files uploaded":($key=="mkdir"?"Folders created":"Permissions changed"))." successfully.</font>\n";
 
                else
 
                    echo "<font color=red>Failed to: $value </font>\n";
 
            }
 
        else
 
        $result == "site" || $result == "put" || $result == "mkdir" ? $this->natij[$result]++ : $this->natij[] = $result;
 
    }
 
    function get_mod($dir) {
 
        $stat =  stat ( $dir );
 
        $mode = substr(decoct ($stat[mode]), -3);
 
        if ($mode=="777" ) $this->log("$dir mode is 777!!");
 
        return $mode;
 
    }
 
    function copy( $local , $remote ) {
 
        if(!$this->orgDir){
 
            $this->orgDir = realpath($local);
 
            if (!is_dir($local)) {
 
                $this->file_copy ( $local , $remote );
 
                return true;
 
            }else{
 
                $local = realpath($local)."/";
 
                if (!@ftp_chdir($this->conn_id, $remote)){
 
                    $this->mkdir ( $local , $remote );
 
                }
 
            }
 
        }
 
        if ($open = opendir($local)) {
 
                while (false !== ($file = readdir($open))) {
 
                    if ($file != "." && $file != "..") {
 
                        $remote_file = $remote.substr(realpath($local.$file), strlen($this->orgDir));
 
                        $local_file = $local.$file;
 
                        if (!is_dir($local_file)) {
 
                            $this->file_copy ( $local_file , $remote_file );
 
                        } else {
 
                            $this->mkdir ( $local_file , $remote_file );
 
                            $this->copy($local . $file . "/" , $remote);
 
                        }
 
                    }
 
                }
 
            closedir($open);
 
        }
 
    }
 
    function mkdir ( $local , $remote ){
 
        $site = "CHMOD ".$this->get_mod($local)." $remote";
 
        @ftp_mkdir($this->conn_id, $remote)?$this->log("mkdir"):$this->log("mkdir $remote");
 
        ftp_site($this->conn_id, $site) ? $this->log("site") : $this->log($site);
 
    }
 
    function file_copy ( $local , $remote ) {
 
        $site = "CHMOD ".$this->get_mod($local)." $remote";
 
        ftp_put($this->conn_id, $remote, $local, FTP_BINARY)?$this->log("put"):$this->log("put $local in $remote");
 
        ftp_site($this->conn_id, $site)?$this->log("site"):$this->log($site);
 
    }
 
 
 
};
 
?>
 
 |