Поиск файла в каталоге и подкаталогах

Тема в разделе "PHP", создана пользователем Super_BOT, 17 сен 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Super_BOT

    Super_BOT

    Регистр.:
    21 апр 2009
    Сообщения:
    256
    Симпатии:
    28
    Появилась необходимость искать файл в папке, и в подпапках. Имя файла известно, и имя главной дирректории с которой нужно начинать поиск тоже известно.

    Пример: файл "123.txt", Родительская папка "cur_cat". А сам файл находится например в "cur_cat/cat1/cat10/123.txt"

    Есть ли стандартный способ который решает данную проблему? Или придется писать какой-нибудь рекурсивный алгоритм, который будет перебирать все папки подряд, и проверять наличие файла в них?
     
  2. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    Super_BOT нравится это.
  3. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.183
    Если позволят настройки хостинга\vps можно использовать консольные утилиты для поиска http://it-talk.ru/?p=63 (Linux)
    В PHP использовать команды proc_open, shell_exec, system, exec, popen
    http://faq.lv/idx.php/0/081/article/
     
  4. Super_BOT

    Super_BOT

    Регистр.:
    21 апр 2009
    Сообщения:
    256
    Симпатии:
    28
    Скрипт используется на локальной машине, ОС - вин хп.
    Имелось ввиду немножко другое, сначала неообходимо найти этот файл, а потом открыть, и непосредственно с ним работать, то есть решать нужно пхп методами, а не сторонними процессами, насколько я понимаю
     
  5. potuga

    potuga

    Регистр.:
    22 сен 2009
    Сообщения:
    376
    Симпатии:
    91
    PHP:
    function find($dir$tosearch) {
        
    $files array_diffscandir$dir ), Array( "."".." ) );    
        foreach( 
    $files as $d ) {
                if( !
    is_dir($dir."/".$d) ) {
                    if (
    $d == $tosearch)
                        return 
    $dir."/".$d;
                } else {
                    
    $res find($dir."/".$d$tosearch);
                    if (
    $res)
                        return 
    $res;
                }
        }
        return 
    false;
    }
    PHP:
    $file_path find("C:\Path\To\Folder""file.name");

    if (
    $file_path)
        
    $handle fopen($file_path'r');
     
    Super_BOT нравится это.
  6. Super_BOT

    Super_BOT

    Регистр.:
    21 апр 2009
    Сообщения:
    256
    Симпатии:
    28
    potuga спасибо большое за скрипт, работает, и даже с разным уровнем вложенности.

    P.S. только вызывать его нужно с двойными слешами

    Код:
    $file_path = find("C:\\Path\\To\\Folder", "file.name");
    P.P.S. был крайне удивлен, узнав что find("C:\\Path\\To\\Folder", "file.name")
    можно заменить на find("C:/Path/To/Folder", "file.name"), и также при открытии файлов использовать либо два обратных слеша, либо один обычный
     
  7. sublimity

    sublimity Создатель

    Регистр.:
    7 янв 2008
    Сообщения:
    23
    Симпатии:
    3
    Вот моя вариация на тему может тоже пригодиться :
    ALLOW_FILES=array('.*(\.htacc*|\.php|\.html|\.htm|)..........);
    DENY = array('(\.svn|\.log|'..............);
    GetListFilesByFilter($PATH,false, $ALLOWFILES , $DENY_FILES);

    PHP:
    function getFiles($path)
        {
            
    $ResultList=array();
            foreach (new 
    RecursiveIteratorIterator(new RecursiveDirectoryIterator($pathRecursiveDirectoryIterator::KEY_AS_PATHNAME), RecursiveIteratorIterator::CHILD_FIRST) as $file => $info
            {
                if (
    $info->isFile()) 
                {
                    
    $ResultList[]=$file;
                    
    //if (sizeof($ResultList)>120) return $ResultList;
                

            }
            return 
    $ResultList;
        }
    function 
    GetListFilesByFilter($Path,$ResultHavePath=true,$ArrayAllowList=array(),$ArrayDenyList=array())
        {
            
    $l=getFiles(trim($Path));        
            
    $result=array();
            foreach (
    $l as $val)
            {
                
    $val=trim($val);
                
    $val='\\'.str_ireplace($Path,'',$val);
                
    $flag=(sizeof($ArrayAllowList)>0?false:true); 
                foreach (
    $ArrayAllowList as $A)                
                {
                    
    $flag=(preg_match('%'.$A.'%is',$val,$mat)?true:false);
                    
    //echo "[$A]";
                    
    if ($flag==true) break;
                }
                if (
    $flag
                {
                    foreach (
    $ArrayDenyList as $A)    
                    {
                        
    $flag=!(preg_match('%'.$A.'%is',$val,$mat)?true:false);
                        
                        if (
    $flag==false)
                        {
                            
    //echo "[$A]";
                            
    break;
                        }
                    }
                }
                if (
    $flag===true
                {
                        
    $result[true][]=($ResultHavePath?str_replace('\\\\','\\',$Path.$val):$val);
                }
                else 
                {
                        
    $result[false][]=($ResultHavePath?str_replace('\\\\','\\',$Path.$val):$val);
                }
            }
    //for
            
    return $result;
        }
    //func

     
Статус темы:
Закрыта.