<?
 
 
/**
 
 * ADV_FTP a simple PHP spider class to indexing remote recursive directory and handy to put MySQL .
 
 * Support now UNIX and Windows_NT FTP filesystem.
 
 * 2011-07-31 Tomasz Malewski - varsovie (nospam) o2.pl 
 
 */
 
class adv_ftp {
 
    
 
    function adv_ftp () {
 
        $this->level = 1;
 
        $this->pwd = "";
 
        }    // adv_ftp init
 
 
    // Estabilish connection
 
    public function conn($hostname, $username, $password) {
 
        $this->hostname=$hostname;
 
        $this->username=$username;
 
        $this->password=$password;
 
        $this->conn_id = ftp_connect($this->hostname);     
 
        $login_result = ftp_login($this->conn_id, $this->username, $this->password); 
 
        ftp_pasv($this->conn_id, true); 
 
        $this->systype = ftp_systype($this->conn_id);        // Estimate FTP System type to analyze date
 
//        if ((!$conn_id) || (!$login_result)) { echo " *** ADV_FTP : Unable to connect <br>\r\n";    }
 
        }    // conn end
 
 
    // Classid dir for FTP , return array $this->dir
 
    public function listFiles() {
 
//        $buff = ftp_rawlist($this->conn_id, '.', true);        // recursive dir  3rd parameter PHP 4.3
 
        $buff = ftp_rawlist($this->conn_id, '.');
 
//        var_dump($buff); 
 
        $this->pwd = ftp_pwd($this->conn_id);
 
        foreach ($buff as $line) {
 
            switch ($this->systype) {        // select UNIX or Windows NT FTP remote
 
 
                case "UNIX":
 
                $finfo = preg_split("/[\s]+/", $line, 9);
 
                if ($finfo[0] !== "total") {
 
//                    print_R ($finfo);
 
                    $filepath = $this->hostname."".$this->pwd."/".$finfo[8];
 
                    $this->dir[$filepath][filename] = $finfo[8];
 
                    $this->dir[$filepath][dir] = $this->pwd;
 
                    $this->dir[$filepath][date] = strtotime("$finfo[5] $finfo[6] $finfo[7]");
 
                    $this->dir[$filepath][size] = $finfo[4];
 
                    if (preg_match("/^d/",$finfo[0])) { $this->dir[$filepath][isdir]='1';}
 
                    }    // if vinfo != 0
 
                break;
 
 
                case "Windows_NT":
 
                ereg("([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|<DIR>) +(.+)",$line,$finfo);
 
                $filepath = $this->hostname."".$this->pwd."/".$finfo[8];
 
                $this->dir[$filepath][filename] = $finfo[8];
 
                $this->dir[$filepath][dir] = $this->pwd;
 
                $this->dir[$filepath][isdir] = ($finfo[7]=="<DIR>");
 
                $this->dir[$filepath][date] = strtotime($finfo[1]."/".$finfo[2]."/".$finfo[3]);
 
                $this->dir[$filepath][size] = $finfo[7];
 
//                print_r ($finfo);
 
 
                break;
 
 
                }    // switch systype
 
            }    // line
 
        }    // listfiles end
 
 
    // recursive dir. changeDir should be execute before to set start point. Don't forget to set $this->level
 
    function recursive($directory,$level)    {
 
        ob_end_flush(); ob_flush(); flush(); ob_start(); 
 
        if ($directory == FALSE ) $directory = $this->pwd;
 
        if ($level <= $this->level)
 
            {
 
            $this->changeDir("".$directory);
 
            $this->listfiles();
 
//             print_R ($this->dir);
 
            foreach ($this->dir as $filename=>$key) {
 
                if ($key[isdir]==1) {$newlevel=$level+1;$this->recursive($key[dir]."/".$key[filename]."",$newlevel);}
 
 
                }        // each dir
 
            }    // white level
 
        }    // recursive end
 
 
    public function changeDir($dir) {
 
        ftp_chdir($this->conn_id, "/".$dir);
 
        $this->pwd=$dir;
 
        }    // changeDir
 
 
    public function close() {
 
        ftp_close($conn_id); 
 
        }    // close end
 
 
 
    }    // adv_ftp end
 
 |