2008-10-30
Как вывести список файлов через FTP
Встала такая задача - вывести в список всех флеш роликов используемых в проекте. При этом известен только FTP заход. Конечно, можно просмотреть все страницы сайта, посмотреть где есть ссылки на swf и записать их адреса, но это займет много времени да к тому же можно что либо пропустить. Можно воспользоваться возможностями FAR Мanager, но он не выводит результат в текстовый файл, поэтому написал вот такую программку:
<?php
error_reporting(E_ALL | E_STRICT);
class FtpSearch {
    var $server_url = '';
    var $username = '';
    var $password = '';
    var $remote_folder = '';
    var $ftp;
    function log($message){
        print $message;
    }
    
    function show(){
        $this->ftp = ftp_connect($this->server_url);
        if ($this->ftp===FALSE){
            $this->log('Can not connect to FTP server');
        }
        else {
            $this->log('Connected successful');
            if(ftp_login($this->ftp,$this->username,$this->password)){
                $this->getListOfFiles($this->remote_folder,$this->remote_folder);
            }
            else {
                $this->log('Login failure!');
            }
            ftp_quit($this->ftp);
            $this->log('Connection closed!');
        }
    }
    
    function getListOfFiles($folder,$filename){
        flush ();
        set_time_limit(30);
        if (ereg('\.swf$',$folder)){
            print $folder.'<br />';
        }
        $c = @ftp_chdir($this->ftp,$filename);
        if ($c){
            $list = ftp_rawlist($this->ftp,'');
            $files = array();
            reset($list); 
            while (list(,$row) = each($list)) {
                $buf="";
                if ($row[0]=='d'||$row[0]=='-'){ 
                    $buf = ltrim(substr($row,55));
                    $files[]=$buf;                
                }
            }
            if ($files!==FALSE){
                foreach($files as $file){
                    if (($file!='..') and ($file!='.')){
                        $this->getListOfFiles($folder.'/'.$file,$file);
                    }
                }
            }
            $c = ftp_chdir($this->ftp,'..');
        }
    }
}
$c = new FtpSearch();
$c->show();
?>
разрешены только теги br, font, span, p, strong, u, p, blockquote, a, div, img - остальные будут безжалостно удаляться
комментарии:
Да мне их мощность, в принципе, не нужна была, нужно было чтобы быстро и чтобы все работало. Да и для того чтобы проверить хвост файла можно и substr без вопросов применить, эта функция в разы быстрее будет работать, но это ведь думать надо было :)
Не надо ничего путать, функции семейства str* не имеют ничего общего с регулярными выражениями, следовательно работают гораздо быстрее т.к. менее гибкие и не требуют предварительной компиляции. О чем, кстати, и написано в документации: If you dont need fancy replacing rules (like regular expressions), you should always use this function instead of ereg_replace() or preg_replace().